我希望只有当用户在其帐户下列出此设备ID时才允许对firebase中的设备列表进行读取访问。
正如Anant在他的回答中所建议的那样:Security Rules - lists of data that can be read? 我实现了这个firebase数据结构:
{
devices: {
111: {status: 10},
222: {status: 5}
},
users: {
aaa: {
name: 'Jim',
devices: {
111: {name: 'Test Device'}
}
}
bbb: {
name: 'Jane',
devices: {
111: {name: 'Test Device'},
222: {name: 'New Device'}
}
}
}
}
澄清产出,用户" aaa"名叫Jim应该只能读取设备ID" 111"从设备列表中获取它的子元素。用户" bbb"名叫简可以看到两个设备" 111"和" 222"和他们的孩子元素
所以我实施了几项规则试验,结束了以下内容:
{
"rules": {
"users":{
"$user_id":{
".read": "auth.uid == $user_id",
"devices": {
"$devices_id":{
".read":true
}
}
}
},
"devices":{
"$devices_id":{
".read": "root.child('users').child(auth.uid).child('devices').hasChild('$devices_id')",
".write": false
}
}
}
}
在读取设备数据时,此规则应查看/ root / users // devices / $ devices_id,并查看发出请求的用户下是否存在该device_id。然后允许对该记录的读访问权限。根据上面链接的帖子,这应该是可能的,但帖子没有表明应该为"对话"的主要列表设置什么权限。 (在我的情况下是设备)... Anant只会说"确保在顶级对话列表中正确设置权限"。有人可以澄清如何做到这一点吗?
根据上述规则,我只会根据这些请求获得许可。我也尝试过:
"root.child('users').child(auth.uid).child('devices').child('$devices_id').exists()"
这也不起作用......
非常感谢有关此过程的任何指导。我也对其他数据结构和规则结构持开放态度。这是一个新项目,在这个阶段非常可修改。
谢谢!
答案 0 :(得分:1)
感谢@Kato!除了$ device_id周围的字符串文字外,上面的实现是正确的。
更改
.hasChild('$devices_id')
要
.hasChild($devices_id)
修复了问题,并且只允许从顶层设备结构中读取用户下的已分配设备。