【问题标题】:Firebase realtime database rules - Allow multiple user access to list all messagesFirebase 实时数据库规则 - 允许多个用户访问以列出所有消息
【发布时间】:2019-08-04 14:05:54
【问题描述】:

我想授予 多个 用户访问权限,以获取他们有权在 Firebase 实时数据库中访问的“消息”集合。数据库获取将读取“/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"
    }
  }
}

亲切的问候 /K

【问题讨论】:

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


    【解决方案1】:

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

    因此,如果您将侦听器附加到/messages,服务器会检查您是否具有对/messages 的读取权限。既然你不这样做,它就会拒绝听众。

    如果你想让用户阅读他们是所有者的消息,你需要做两件事:

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

    有关这方面的更多信息,请参阅 Firebase documentation on securely querying datablog post introducing this feature

    【讨论】:

    • 您好,弗兰克,感谢您及时明确的回复!我了解原理,但我无法弄清楚如何在不知道每条消息的 id 的情况下使多个用户可以访问消息集合。解决方案是存储一个单独的用户特定消息集合(仅包含 id) - 然后手动仅获取这些消息吗?亲切的问候/K
    • 我的错。 :D 链接后我没有阅读文档。现在清楚多了。完成查询和规则后,我将使用示例更新帖子。 /K
    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多