Firebase安全API读取权限被拒绝



我在这里找到了一个使用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)",
      ... 
     }

相关内容

  • 没有找到相关文章

最新更新