我在这里找到了一个使用firebase安全api的基于权限的聊天室的简洁小示例
注意"chat": {
// the list of chats may not be listed (no .read permissions here)
当我加载用户的收件箱时,我实际上需要列出用户所属的聊天记录,但是我似乎无法正确获得.read
规则。
我试着用下面的规则,完全有意义,但不起作用:
"convos": {
".read" : "auth != null && data.child('users').hasChild(auth.id)",
我怀疑问题是在convo和用户之间仍然有一个层次。Aka会更有意义:
"convos": {
".read" : "auth != null && data.child($key + '/users').hasChild(auth.id)",
$key : { ... }
但这是不允许的,它抱怨$key还不存在。
我如何允许用户使用此设置拉出他们所属的所有convos ?
不能使用安全规则来过滤数据。通常,您的数据结构将相当依赖于您的特定用例——最直接的是如何读取数据。
一般的解决方案是将用户所属的聊天列表与批量聊天数据分开,即进行大量的非规范化,并单独访问聊天。
/messages/$chat_id/... (messages chronologically ordered using push() ids)
/chats/$chat_id/... (meta data)
/my_chats/$user_id/$chat_id/true (the value here is probably not important)
现在要访问我所有的聊天记录,我可以这样做:
var fb = new Firebase(URL);
fb.child('my_chats/'+myUserId).on('child_added', function(snap) {
var chatID = snap.name());
loadChat(chatID);
});
function loadChat(chatID) {
fb.child('messages/'+chatID).on('child_added', function(snap) {
console.log('new message', chatID, snap.val());
});
}
您仍然需要安全规则来验证聊天消息的结构,以及对用户聊天列表的访问,等等。但是过滤功能可以通过这样的索引来完成,或者通过另一个创造性的数据结构来完成。
我不完全确定你是如何构建你的Firebase,但这可能工作:
"convos": {
$key : {
".read" : "auth != null && data.child('users').hasChild(auth.id)",
...
}