我正在尝试将用户访问权限限制在某些高级节点上,但希望使某些用户能够读取某些子节点。
我的数据结构是这样的:
{
"COMPANIES" : {
"COMPANY1" : {
"id" : "COMPANY1",
"name" : "COMPANY1 COMPANY"
},
"COMPANY2" : {
"id" : "COMPANY2",
"name" : "COMPANY2 COMPANY"
}
},
"USERS" : {
"xZgFtwVyQFsPK3428YCa3NekOEF3" : {
"company" : {
"COMPANY1" : true,
"COMPANY2" : true
},
"email" : "ss@sss.com",
"uid" : "xZgFtwVyQFsPK3428YCa3NekOEF3",
"username" : ""
}
}
}
以此类推。
还有我的规则:
{
"rules": {
"USERS": {
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
},
"COMPANIES": {
"COMPANY1": {
".read": "root.child('USERS').child(auth.id).child('company').child('COMPANY1').val() == true",
".write": false
}
}
}
}
我用于访问此数据的代码如下所示(在Swift中):
refFire.child("COMPANIES").child("COMPANY1").observe(DataEventType.value, with: { (dsnap) in
另外,我尝试了这个:
refFire.child("COMPANIES").queryOrdered(byChild: "COMPANY1").queryEqual(toValue: "COMPANY1").observe(DataEventType.value, with: { (dsnap) in
还有一个(不幸的是,我不太了解queryEqual
背后的想法,所以我尝试了不同的方法):
refFire.child("COMPANIES").child("COMPANY1").queryOrdered(byChild: "COMPANY1").queryEqual(toValue: "COMPANY1").observe(DataEventType.value, with: { (dsnap) in
因此,我想授予个人资料中带有COMPANY1 = true
的用户访问COMPANY1(并拒绝其他所有人)。规则似乎相对简单明了,但显然我在这里做错了,因为即使使用COMPANY1 = true
的用户也无法读取公司信息,该权限也被拒绝。