允许列出具有读取权限的子项的数据库规则

Database rule allowing to list children with read access

我的应用程序中有一个消息列表,我希望我的用户检索他们自己的消息列表。

如果我以 "user1" 身份登录,我可以毫无问题地获取 /messages/message1,但是如果我想检索所有消息(没有能够使用 /messages/ 访问其他用户的消息)即使我可以访问某些子元素

,我的权限也被拒绝

如何在不知道消息 ID 的情况下向我的用户提供所有具有读取权限的子元素的列表?

提前致谢。

下面是我的数据库:

{
  "messages" : {
    "message1" : {
      "sender" : "user1_uid"
      },
    "message2" : {
      "sender" : "user1_uid"
    }
}

这是我的规则:

{
    "messages": {
        "$weddingId": {
            ".read": "data.child('sender').val() == auth.uid"
        }
    }
}

我建议进行重构以实现您的期望,因为您将无法使用 .orderByChild('sender').equalTo(user_uid),因为您没有授予对 /messages 分支的读取权限(仅针对它的子分支)。

您可以将 userId 作为 /messages 中的一个分支,并在其中包含所有玩家消息 ID。您需要像下面这样保存消息数据:

{
  "messages" : {
    "userId" : {
        "message1" : {
            "text": "tetet"
        },
        "message2" : {
            "text" : "tetet2"
        }
    },
    "userId2": {...}
}

那么您的规则将如下所示:

{
    "messages": {
        "$userId":{
            ".read": "$userId == auth.uid",
            "$weddingId": {
                //...
            }
    }
}

最后,您将能够获得所有用户消息:

firebaseRef.child('messages').child(user_uid).once('value', function(snapshot) {
    if (snapshot.val()){
        console.log(snapshot.val());
    }
})

Adolfo 有一种有效的方法。他将消息数据散布在用户特定的节点下。这在 NoSQL 数据库中很常见,本质上是构建许多 "mini-tables of messages" 而不是一个大数据库。

或者,您可以保留消息的主列表,但为每个用户创建一个所谓的消息索引:

{
  "messages" : {
    "message1" : {
      "sender" : "user1_uid"
      },
    "message2" : {
      "sender" : "user1_uid"
    }
  },
  "user_messages": {
    "user1_uid": {
      "message1": true,
      "message2": true
    }
  }

您会像现在一样保留 messages 的安全规则,但为新的 user_messages 索引添加这些规则:

"user_messages": {
  "$userId":{
    ".read": "$userId == auth.uid"
  }
}

有了这些,您可以通过首先从 /user_messages/<authData.uid> 加载消息 ID,然后从 /messages/<messageId>.

加载每条消息来为用户加载消息

另请参阅我们的 guide on creating data that scales 以了解有关此技术(称为扇出)的更多信息。