【发布时间】:2015-10-11 19:38:10
【问题描述】:
我希望仅当用户在其帐户下列出此设备 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'}
}
}
}
}
为了澄清输出,名为 Jim 的用户“aaa”应该只能从设备列表中读取设备 ID“111”并获取它的子元素。名为 Jane 的用户“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()"
这也不起作用......
我们将不胜感激有关此过程的任何指导。我也对实现这一点的其他数据结构和规则结构持开放态度。这是一个新项目,现阶段可以修改。
谢谢!
【问题讨论】:
-
如果您在模拟器中尝试这些规则,您会得到什么?此外,$devices_id 不应在 hasChild() 中使用引号(这是字符串文字,而不是变量)。
-
用这个是强码!做得好,字符串文字是问题所在。一切都在模拟器中运行,我将很快在这里进行测试。感谢你的回答。创建一个答案,以便我可以选择它作为正确的答案!