我想给多个用户访问以获取他们在Firebase Realtime数据库中可以访问的“消息”集合。数据库提取将读取“ / messages”,并返回用户有权访问的所有消息的集合。数据库结构如下所示:

"messages" : {
  "-L123456789": {
    "access": {
      "author": "user-one-id-987654"
      "assigned-user-id-1234": "assigned-user-id-1234"
    }
    "data" : {
      "theData": "Hello world!"
    }
  }
}


我创建了以下规则:

{
  "rules": {
    "messages": {
      "$message_id": {
        "data": {
          ".read": "
            //if author or assigned user
            data.parent().child('access').child('author').val() === auth.uid ||
            data.parent().child('access').child(auth.uid).exists()
          ",
          ".write": "false"
      }
    }
  }
}


但是,当我被列为作者或指定用户时,我无法获得所有消息的集合。

通过什么规则,被列为“作者”(user-one-id-987654)或“已分配用户”(assigned-user-id-1234)的用户只需阅读“ / messages /“数据库路径?

我猜“消息”根源中的规则可能是答案?

我尝试了以下规则-它授予所有经过身份验证的用户访问权限-但我只希望返回将用户列为“作者”或“已分配用户”的集合。

{
  "rules": {
    "messages": {
      ".read": "auth.uid !== null"
    }
  }
}


亲切的问候
/千

最佳答案

Firebase服务器端安全规则不能用于过滤数据。将侦听器附加到数据库时,服务器将检查该侦听器是否保证始终满足规则(无论数据如何)。如果不符合规则,则立即拒绝侦听器。

因此,如果将侦听器附加到/messages,则服务器将检查您是否具有对/messages的读取权限。而且由于您不这样做,它会拒绝侦听器。

如果要允许用户阅读他们是所有者的邮件,则需要两件事:


仅检索用户拥有的消息的查询。
确保仅允许查询的安全规则。


有关更多信息,请参见Firebase documentation on securely querying datablog post introducing this feature

07-27 14:04