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

时间:2016-07-12 13:07:29

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

我的应用中有一个消息列表,我希望我的用户能够检索自己的消息列表。

如果我已登录为" user1"我可以毫无问题地获取 / messages / message1 ,但如果我想通过 / messages /检索我的所有邮件(无法访问其他用户的邮件) 即使我可以访问某些子元素

,我也会被拒绝

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

提前谢谢。

以下是我的数据库:

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

这是我的规则:

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

2 个答案:

答案 0 :(得分:2)

我建议进行重构以实现您期望的内容,因为您无法使用.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());
    }
})

答案 1 :(得分:1)

阿道夫有一种有效的方法。他在特定于用户的节点下传播消息数据。这在NoSQL数据库中很常见,基本上构建了许多消息的迷你表格。而不是一个大的。

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

{
  "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了解有关此技术的更多信息(称为扇出)。