我正在尝试使用Firebase平台开发一个简单的聊天应用。要显示我正在使用 FirebaseRecyclerAdapter 的会话列表。问题是,我无法弄清楚如何正确设置规则,以便用户只能访问他们所属的会话。
这就是我的Firebase数据库结构的样子。
{
"conversations": {
"cid1": {
"title": "Conversation1"
},
"cid2": {...
},
"cid3": {...
}
},
"members": {
"cid1": {
"uid1": true,
"uid2": true
},
"cid2": {...
},
"cid3": {...
}
},
"users": {
"uid1": {
"name": "User1"
},
"uid2": {...
},
}
}
这些是我试图应用的规则。
{
"rules": {
"conversations": {
"$conversation_id": {
".read": "root.child('members').child($conversation_id).child(auth.uid).exists()",
}
},
}
}
通过应用此规则并使用 FirebaseRecyclerAdapter ,我收到此错误。
收听/会话失败:DatabaseError:Permission denied
我想这是因为我允许用户阅读会话元素,而不是整个会话列表。有人知道如何解决这个问题吗?
答案 0 :(得分:0)
您在Firebase的安全规则中遇到了一个陷阱:您无法使用安全规则来过滤数据。
您的列表适配器正在监听/conversations
。根据用户是否具有/conversations
的读取权限,该读取操作将成功或失败。
由于您未授予{{1}}读取权限,因此将取消收听者。这在文档中称为Rules Are Not Filters,并且一直是covered frequently here on Stack Overflow(因为它是一个常见的陷阱)。有关最古老且最佳答案之一,请参阅:Restricting child/field access with security rules