首页 文章

限制对一组中用户的firebase数据库的访问

提问于
浏览
0

我一段时间写了一个简单的聊天应用程序来帮助我学习node和socket.io,我最近一直在研究firebase作为app / website的平台,我遇到了一个我无法解决的有趣问题 . 在应用程序内将有一个聊天应用程序,将有渠道和所有好东西,困难的部分是将有私人聊天,其中2个用户可以私下谈话 . 计划是将聊天存储在firebase数据库中 . 现在,我可以根据用户是否经过身份验证轻松限制对firebase数据库的访问,甚至限制用户配置文件访问经过身份验证的用户以及拥有该配置文件的用户,但我试图找出如何限制对“私人聊天”的访问权限“聊天”数据库的子项,仅限于该对话中的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)仅限于“users”数组中的用户 . 这样,除非他们在特定的聊天中,否则没有人可以读取或写入该特定聊天 . 我根本不知道如何去做 . 我知道你可以做的事情

“ . read”:“auth!== null && auth.uid = $ uid”

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

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

1 回答

  • 2

    你的第一个问题是你想要重复的值,而且很可能订单并不重要 . 在这种情况下,您应该使用 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>: { ... }
    

相关问题