我已经阅读并尝试了非规范化,虽然对于可以公开访问的评论/消息等情况非常有意义,而用户只能写入自己的路径/节点,但我很难限制“。阅读“规则给用户/所有者和另一个用户/管理员。我的用例不会公开发布所有邮件。例如,要说明user1的消息只能由user1和admin读取,同时仍保留对user1的只写。
这是如何实现的?在安全规则中,我尝试过:
"messages": {
".read": "auth !== null",
".write": "auth !== null",
"$message": {
".read": "data.child('userID').val() === auth.uid"
}
}
OR
"messages": {
".write": "auth !== null",
"$message": {
".read": "data.child('userID').val() === auth.uid"
}
}
OR
"messages": {
"$user_id": {
".read": "auth.uid === $user_id"
".write": "auth.uid === $user_id"
}
}
虽然最后一个确实限制读取和写入经过身份验证的用户,比如user1,但我没有运气让管理员用户获取所有用户的消息。第一,我无法规避级联/自上而下的规则。
我是一个firebase新手,所以如果这很简单,我会感激任何帮助。
谢谢!
答案 0 :(得分:3)
这取决于您如何定义管理员。
我们首先要说您的管理员是uid SOF
的已知用户。
"messages": {
"$user_id": {
".read": "auth.uid === $user_id || auth.uid == 'SOF'"
".write": "auth.uid === $user_id"
}
}
如果您希望管理员可配置,您可能会将其ID存储在其他位置,例如在名为administrators
的节点中:
administrators
SOF: true
Frank: true
messages
...
在这种情况下,您可以检查当前uid是在当前节点中还是存在于管理员列表中:
"messages": {
"$user_id": {
".read": "auth.uid === $user_id || root.child('administrators/'+auth.uid).exists()"
".write": "auth.uid === $user_id"
}
}
由于您希望管理员能够阅读所有邮件,因此您最终会:
"messages": {
".read": "root.child('administrators/'+auth.uid).exists()",
"$user_id": {
".read": "auth.uid === $user_id",
".write": "auth.uid === $user_id"
}
}