使用FirebaseRecyclerAdapter

时间:2016-06-25 12:02:08

标签: android firebase firebase-realtime-database firebase-security

我正在尝试使用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

我想这是因为我允许用户阅读会话元素,而不是整个会话列表。有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您在Firebase的安全规则中遇到了一个陷阱:您无法使用安全规则来过滤数据。

您的列表适配器正在监听/conversations。根据用户是否具有/conversations的读取权限,该读取操作将成功或失败。

由于您未授予{{1}}读取权限,因此将取消收听者。这在文档中称为Rules Are Not Filters,并且一直是covered frequently here on Stack Overflow(因为它是一个常见的陷阱)。有关最古老且最佳答案之一,请参阅:Restricting child/field access with security rules