Firebase 中的多个管理员 - 这可能吗?
Multiple admins in Firebase - is it possible?
我正在尝试创建一个仅使用 Firebase 作为数据库服务的客户端应用程序,但我在定义允许多个 'admin'
用户访问某些数据的安全规则时遇到了一些困难。
我的数据模式如下所示:
{
admins: {
simpleLogin:1 : true,
facebook:1234 : true
},
myData: {
simpleLogin:1 : {
.....
},
google:1234 : {
.....
},
facebook:1234 : {
.....
}
}
}
我正在尝试允许登录用户写入其在 'data' 对象中的位置(我正在使用 ref.child('myData').child(auth.uid).set(...)
和 写入以防止用户访问其他用户数据。此外,其uid
定义在'admins'
数据中的用户应该能够读取/写入所有'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)"
}
}
}
- 我正在使用本地节点服务手动将用户添加到
'admins'
,每次我想让用户成为管理员时,我都会 运行ning。
当然这是行不通的,因为 'myData'
没有明确定义 read/write 权限 - 所以当我试图与用户一起阅读 ref.child('myData').once('value', function() {..})
时,它的 uid
在 'admins'
- 我做不到。
我正在尝试 运行 以下查询并获取其 uid 在 'admins
中的用户并获取 permission denied
ref.child('myData').once('value', function(snapshot)
{console.log(snapshot.val())}, function() {console.log(arguments)}))
是否有可能做我想做的事?
每个用户都应该能够阅读 admins
节点。
"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 的 cascading security rules:要理解的关键部分是
The child rules can only grant additional privileges to what
parent nodes have already declared.
基本上,如果您是管理员,那么您将被授予在 myData 级别(及其子级)的读写权限,并且没有任何东西可以撤销它。如果您不是管理员,您仍然可以获得较低级别的访问权限,如上例所示。
我正在尝试创建一个仅使用 Firebase 作为数据库服务的客户端应用程序,但我在定义允许多个 'admin'
用户访问某些数据的安全规则时遇到了一些困难。
我的数据模式如下所示:
{
admins: {
simpleLogin:1 : true,
facebook:1234 : true
},
myData: {
simpleLogin:1 : {
.....
},
google:1234 : {
.....
},
facebook:1234 : {
.....
}
}
}
我正在尝试允许登录用户写入其在 'data' 对象中的位置(我正在使用 ref.child('myData').child(auth.uid).set(...)
和 写入以防止用户访问其他用户数据。此外,其uid
定义在'admins'
数据中的用户应该能够读取/写入所有'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)"
}
}
}
- 我正在使用本地节点服务手动将用户添加到
'admins'
,每次我想让用户成为管理员时,我都会 运行ning。
当然这是行不通的,因为 'myData'
没有明确定义 read/write 权限 - 所以当我试图与用户一起阅读 ref.child('myData').once('value', function() {..})
时,它的 uid
在 'admins'
- 我做不到。
我正在尝试 运行 以下查询并获取其 uid 在 'admins
中的用户并获取 permission denied
ref.child('myData').once('value', function(snapshot)
{console.log(snapshot.val())}, function() {console.log(arguments)}))
是否有可能做我想做的事?
每个用户都应该能够阅读 admins
节点。
"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 的 cascading security rules:要理解的关键部分是
The child rules can only grant additional privileges to what parent nodes have already declared.
基本上,如果您是管理员,那么您将被授予在 myData 级别(及其子级)的读写权限,并且没有任何东西可以撤销它。如果您不是管理员,您仍然可以获得较低级别的访问权限,如上例所示。