【问题标题】:restricting access to firebase database to users within a set将对 Firebase 数据库的访问限制为一组内的用户
【发布时间】:2017-12-29 10:59:37
【问题描述】:

前段时间我写了一个简单的聊天应用程序来帮助我学习 node 和 socket.io,我最近一直在研究 firebase 作为应用程序/网站的平台,我遇到了一个有趣的问题,我不能解决。在应用程序内会有一个聊天应用程序,会有频道和所有好东西,困难的是会有私人聊天,两个用户可以私下交谈。计划是将聊天存储在 firebase 数据库中。现在,我可以根据用户是否经过身份验证轻松限制对 firebase 数据库的访问,甚至限制对经过身份验证的用户和拥有该配置文件的用户的用户配置文件访问,但我正在尝试弄清楚如何限制对“私人聊天”的访问" "chat" 数据库的子项,仅限于该对话中的 2 个用户。 我在想数据库看起来像这样......

{
  "chat": {
    "channels": ['topics', 'current', 'blah', 'blah', 'blah'],
    "{PRIVATE_CHAT_UID_GOES_HERE}": {
      "users": ["{USER_ID_1}", "{USER_ID_2}"],
      "messages": [{"from": "{USER_ID}", "message": "Hi there"},{...}]
      "createdOn": "DATE GOES HERE"
    },
    "{PRIVATE_CHAT_UID_GOES_HERE}": {
      "users": ["{USER_ID}", "{USER_ID}"],
      "messages": [{...}, {...}],
      "createdOn": "DATE GOES HERE"
    }
  }
}

然后我会将对子项(私人聊天 id)的访问限制为仅“用户”数组中的用户。这样,除非他们在该特定聊天中,否则没有人可以读取或写入该特定聊天。我只是不知道该怎么做。 我知道你可以做类似的事情

".read": "auth !== null && auth.uid = $uid"

但我认为这不适用,因为它将使用限制为 uid 的所有者,并且当我将孩子添加到“聊天”以开始用户之间的私人聊天时,uid 会自动生成。

这样的事情是否可能,或者是否有更好的方法来构建数据,从而可以轻松地限制只有参与对话的 2 个用户才能访问? 我试图避免让 node.js 服务器坐在那里只是验证用户是否在聊天中,当您可以列出数据库并直接从数据库处理身份验证时,这似乎是一个毫无意义的开销。我非常乐意提供我所拥有的代码示例,尽管我不知道它们是否相关。提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    您的第一个问题是将用户存储在一个数组中。数组是可以具有重复值的有序集合。在您的场景中,您不希望重复值,并且很可能顺序无关紧要。在这种情况下,您应该使用 set 数据结构,它在 Firebase 中被建模为:

    "users": {
      "{USER_ID_1}": true,
      "{USER_ID_2}": true
    }
    

    现在您可以通过以下方式限制聊天室成员的读取权限:

    {
      "rules": {
        "chat": {
          "$roomid": {
            ".read": "data.child('members').child(auth.uid).exists()
          }
        }
      }
    }
    

    小心在同一个节点中混合不同的数据类型。通常最好将每个实体保留在其自己的顶级节点中,通过它们的键关联不同类型。例如,我会将房间的消息、成员和其他元数据分开:

    chat
      rooms
        <roomid1>
          createdOn: ....
          .... other metadata for the room
      roomUsers
        <roomid1>
          user_id1: true
          user_id2: true
      roomMessages
        <roomid1>
          <message1>: { ... }
          <message2>: { ... }
          <message3>: { ... }
    

    【讨论】:

    • 纯粹的天才。太感谢了。我真的很高兴你也注意到了数据建模,我不太确定我所拥有的是正确的方法。我来自非常强大的 MySQL/PHP 背景,所以我仍然掌握这种类型的数据建模的窍门。非常感谢!
    • 不客气。如果您是 NoSQL 的新手,我建议您阅读 NoSQL data modeling。如果您有 SQL 背景,还请观看我们的Firebase for SQL developers 系列。
    猜你喜欢
    • 2017-06-08
    • 2018-08-18
    • 2023-02-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    相关资源
    最近更新 更多