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

时间:2017-07-23 23:22:58

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

我前一段时间写了一个简单的聊天应用程序来帮助我学习node和socket.io,我最近一直在研究firebase作为app / website的平台,我遇到了一个有趣的问题我可以&#39解决。在应用程序内将有一个聊天应用程序,将有渠道和所有好东西,困难的部分是将有私人聊天,其中2个用户可以私下谈话。计划是将聊天存储在firebase数据库中。现在,我可以根据用户是否经过身份验证轻松限制对firebase数据库的访问,甚至可以限制用户配置文件访问经过身份验证的用户以及拥有该配置文件的用户,但我试图弄清楚如何限制对&#34的访问权限私人聊天" "聊天的孩子"数据库,仅限该对话中的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服务器只是在验证用户是否在聊天中,这似乎是一个毫无意义的开销,当你可以列出数据库并直接从数据库处理auth时。我非常乐意提供我所拥有的代码示例,但我不知道它们是相关的。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的第一个问题是您将用户存储在阵列中。数组是可以具有重复值的有序集合。在您的方案中,您不希望重复值,并且订单很可能并不重要。在这种情况下,您应该使用设置数据结构,在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>: { ... }