Firebase规则,孩子数量有所不同

时间:2018-11-12 18:10:54

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

我正在基于聊天构建一个有角度的Firebase Web应用程序。我的结构的简化示例:

|__ messages
       |__ room1
            |__ msg1
                  |__ author: ""
                  |__ message: ""
                  |__ user1: "user1"
                  |__ user2: "user2"
                  |__ user3: "user3"
|__ users
      |__ room1
            |__ user1: ...
            |__ user2: ...
            |__ user3: ...

我正在尝试编写规则“ .write”来编写一条新消息(不包含云功能),该消息必须具有作者,一条消息以及许多用户ID(此处为user1,user2,user3)有所不同在/ users(=不断变化的用户列表)下。作者和消息没有问题,但是我该如何更改部分?没有云功能甚至有可能吗?

这部分规则现在看起来是这样的:

"$other": {
            ".validate": "$other === newData.val() && root.child('users/'+newData.val()).exists()"
          }

(如果您已经关注我,那么您应该了解$ other在我的示例中代表user1,user2和user3)。

编辑:

根据上面的示例,让我们假设一个用户user4加入会议室1:

|__ messages
       |__ room1
            |__ msg1
                 |__ author: ""
                 |__ message: ""
                 |__ user1: "user1"
                 |__ user2: "user2"
                 |__ user3: "user3"
|__ users
      |__ room1
           |__ user1: ...
           |__ user2: ...
           |__ user3: ...
           |__ user4: ...

现在用户写了一条消息:

|__ messages
      |__ room1
           |__ msg1
                 |__ author: ""
                 |__ message: ""
                 |__ user1: "user1"
                 |__ user2: "user2"
                 |__ user3: "user3"
           |__ msg2
                 |__ author: ""
                 |__ message: ""
                 |__ user1: "user1"
                 |__ user2: "user2"
                 |__ user3: "user3"
                 |__ user4: "user4"
|__ users
      |__ room1
           |__ user1: ...
           |__ user2: ...
           |__ user3: ...
           |__ user4: ...

该消息必须遵循用户列表。

1 个答案:

答案 0 :(得分:-1)

您想要在这里做些事情:

  1. 该节点必须具有user1user2user3属性。
  2. 这些属性的值必须作为关键字存在于/users

您的规则的相关摘要:

"messages": {
  "$messageId": {
    ".validate": "newData.hasChildren('author', 'message', 'user1', 'user2', 'user3')",
    "author": {
      ".validate": "newData.isString()",
    }
    "message": {
      ".validate": "newData.isString()",
    }
    "$other": {
      ".validate": "$other === newData.val() && root.child('users/'+newData.val()).exists()"
    }

  }
}