我似乎很难使用firebase安全规则。我已经阅读了这些指南,但模拟器的结果不够具有描述性(如果我们可以将鼠标悬停在某个节点上,并且弹出一个可以更新规则的按钮,则会更容易)。
这是我的结构:
chats
- randomChatId01
- name: "awesome chat"
- members:
- userId01 : true
- userId02 : true
- randomChatId02
- members:
- userId02 : true
- randomChatId03
- members:
- userId01 : true
- userId02 : true
- ...
我只希望用户能够读取节点的子节点成员包含经过身份验证的用户的 auth.uid 的聊天节点。
因此,在这种情况下,如果 userId01 已登录,则她只能读取 randomChatId01 和 randomChatId03 的读取权。
这是我的规则:
{
"rules": {
"chats": {
"$chat": {
".read": "data.child('members').val().contains(auth.uid)"
}
}
}
}
然而,它在模拟器中返回以下内容:
Attempt to read /chats with auth={"provider":"anonymous","uid":"eF4ztDEXz7"}
/
/chats
No .read rule allowed the operation.
Read was denied.
答案 0 :(得分:5)
这是因为Firebase安全规则是在您从中读取的位置进行评估的。
您正在尝试阅读/chats
。用户没有/chats
的读取权限,因此操作会立即失败。
如果您将/chats/randomChatId01
视为userId01
,则会成功。
文档部分rules are not filters对此进行了介绍。另请参阅Michael Lehenbauer的回答:Restricting child/field access with security rules