Javascript Firebase中有多个管理员-可能吗?
Javascript Firebase中有多个管理员-可能吗?,javascript,firebase,Javascript,Firebase,我正在尝试使用Firebase作为数据库服务创建一个仅客户端的应用程序,但在定义允许多个'admin'用户访问某些数据的安全规则时遇到了一些困难。 我的数据架构如下所示: { admins: { simpleLogin:1 : true, facebook:1234 : true }, myData: { simpleLogin:1 : { ..... }, google:1234 : { ..... },
我正在尝试使用Firebase作为数据库服务创建一个仅客户端的应用程序,但在定义允许多个
'admin'
用户访问某些数据的安全规则时遇到了一些困难。我的数据架构如下所示:
{
admins: {
simpleLogin:1 : true,
facebook:1234 : true
},
myData: {
simpleLogin:1 : {
.....
},
google:1234 : {
.....
},
facebook:1234 : {
.....
}
}
}
我试图允许登录用户写入其在“data”对象中的位置(我使用ref.child('myData').child(auth.uid).set(…)
和防止用户访问其他用户数据。此外,在'admins'
数据中定义其uid
的用户应该能够读取/写入所有'myData'
对象。我的安全JSON定义如下:
{
"rules": {
"admins": {
".write": false,
".read": true
},
"myData": {
"$user_id": {
".read": "$user_id === auth.uid ||
root.child('admins').hasChild(auth.uid)",
".write": "$user_id === auth.uid ||
root.child('admins').hasChild(auth.uid)"
}
}
}
- 我正在使用本地节点服务将用户手动添加到
,每当我想将用户设置为管理员时,我都会运行该服务。“管理员”
'myData'
没有读/写权限的明确定义-所以当我试图读取ref.child('myData')。一次('value',function(){..})
与uid
在'admins'
中的用户一起时-我无法这样做。我正在尝试运行以下查询,并向用户获取其uid位于
管理员中,并且获取权限被拒绝
ref.child('myData').once('value', function(snapshot)
{console.log(snapshot.val())}, function() {console.log(arguments)}))
甚至可以做我想做的事情吗?每个用户都应该能够阅读管理员节点
"rules": {
"admins": {
".write": false,
".read": true
},
如果您担心:允许每个人读取此节点没有风险。没有任何东西阻止您直接向myData
添加规则。这使管理员可以直接访问myData
(以及其中的所有节点)。如果用户不是管理员,他们只能访问自己的节点
"myData": {
".read": "root.child('admins').hasChild(auth.uid)",
".write": "root.child('admins').hasChild(auth.uid)",
"$user_id": {
".read": "$user_id === auth.uid",
".write": "$user_id === auth.uid"
}
}
关于Firebase:需要了解的关键部分是
子规则只能将附加特权授予
父节点已声明
基本上,如果您是管理员,那么您可以在myData级别(及其子级)进行读写操作没有什么可以撤销这一点。如果您不是管理员,您仍然可以获得较低级别的访问权限,如上面的示例所示。您的管理员是否需要访问myData
,或者他们访问myData/$user\u id
就足够了?请回答下面的问题。但如果这还不能回答问题,请编辑您的问题,为您正在进行的查询添加代码尝试运行。嗨,它没有帮助:(我正在尝试运行以下查询:ref.child('myData')。once('value',function(snapshot){console.log(snapshot.val())},function(){console.log(arguments)}))如果用户的uid在管理员列表中,并且“权限被拒绝”,那么我就不能授予“.read”:对myData节点的真正权限,并将写限制留给每个子uid-这将允许每个人都可以读取,但只能修改他们的节点-但我认为这不是一个好模式…嗨,Anid!这是有效的,但是-我无法理解为什么。你能解释一下吗?根据文档(),如果我将“myData”的读取权限仅限于管理员-非管理员如何读取内部节点?这与级联示例中的示例不一样吗?我缺少什么?很高兴提供帮助。我编辑了答案,并做了简要解释。