在过去的几周里,我一直在探索Firebase及其构建网络应用的功能,但在安全规则方面,我遇到了一些问题。
我已经在Firebase上构建了一个数据结构,但我不确定它是否符合最佳实践(如果它没有,请随时提出不同的建议):
{
"groups" : {
<GROUP_KEY>
"name": "",
"rels": {
"users": {
<RELS_USERS_KEY>
"key":"" (USER_KEY)
},
"notes": {
<RELS_NOTES_KEY>
"key":"" (NOTE_KEY)
}
},
"isPrivate": true
},
"users": {
<USER_KEY>
"email": "",
"rels": {
"friends": {
<RELS_FRIENDS_KEY>
"key":"" (USER_KEY)
}
},
},
"notes": {
<NOTE_KEY>
"title": "",
"description": "",
"rels": {
"files": {
<RELS_FILES_KEY>
"key":"" (FILE_KEY)
}
}
},
"files": {
<FILE_KEY>
"mode": "",
"url": ""
}
}
申请流程如下:
其余的逻辑遵循相同的原则,我相信如果我能够理解Firebase安全规则的第一个障碍并将其应用于此案例,我可以完成其余的工作。
我已经尝试了一些规则,但我似乎无法从Web应用程序获得任何反馈,调试这是一个试错过程,并且它不能正常工作
有人能帮助我至少理解它背后的逻辑吗?我已经阅读了他们所有的教程,但它们看起来都很浅薄,没有关于复杂结构的更深层次的例子。
感谢您的帮助。
修改
我已将debug:true
标记添加到登录中(感谢@Kato),但我仍然没有收到有关规则的反馈。根据以下规则,我仍然会进入&#34;群组&#34;查看,但没有得到控制台的反馈,登录用户看到他不应该的组:
{
"rules": {
"groups": {
".read": "data.child('rels').child('users/' + auth.user).exists()",
".write": "data.child('rels').child('users/' + auth.user).exists()"
}
}
}
至于我试过的规则,它们是无数的,但这是最新的规则(仍然没有反馈)。
也许我错过了什么?
再次感谢。
答案 0 :(得分:0)
规则级联。也就是说,如果任何规则允许读取,那么您以后不能在嵌套子级中撤消它。通过这种方式,您可以编写如下规则:
"$record": {
// I can write the entire record if I own it
".write": "data.child('owner').val() === auth.uid",
"foo": {
// anybody in my friends list can write to foo, but not anything else in $record
".write": "data.parent().child('friends/'+auth.uid).exists()"
},
"bar": {
// this is superfluous as permissions are only "granted" and never "revoked" by a child
".write": false
}
}
请注意,因为我是所有者,我也可以写入foo和bar,即使bar试图撤销我的读取权限。
因此,在您的情况下,您的rules
声明列表read: true
允许对整个仓库进行完全读取访问。将其更改为false,您将看到更好的结果。