我正在尝试使用Firebase作为数据库服务创建一个仅限客户端的应用程序,并且我在定义允许多个'admin'
用户访问某些数据的安全规则时遇到一些困难。
/>
我的数据架构如下所示:
{
admins: {
simpleLogin:1 : true,
facebook:1234 : true
},
myData: {
simpleLogin:1 : {
.....
},
google:1234 : {
.....
},
facebook:1234 : {
.....
}
}
}
我正在尝试允许已登录的用户在“数据”对象内写入其位置(我正在使用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'
。当然这不起作用,因为'myData'
没有明确的读/写权限定义 - 所以当我尝试用ref.child('myData').once('value', function() {..})
读取uid
时,'admins'
是在'admins
- 我无法这样做。
我正在尝试运行以下查询并向用户表明其uid位于permission denied
并获得ref.child('myData').once('value', function(snapshot)
{console.log(snapshot.val())}, function() {console.log(arguments)}))
data.combined <- rbind(train, test.survived)
甚至可以做我想做的事情吗?
答案 0 :(得分:4)
没有什么可以阻止您直接向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:要理解的关键部分是
子规则只能授予其他权限 父节点已经声明。
基本上,如果您是管理员,那么您将在myData级别(以及它的子级)获得读写权限,并且没有任何内容可以撤销。如果您不是管理员,您仍然可以获得较低级别的访问权限,如上例所示。
答案 1 :(得分:1)
每个用户都应该能够阅读admins
节点。
"rules": {
"admins": {
".write": false,
".read": true
},
如果您担心:允许每个人读取访问此节点都没有风险。