孩子数变化的Firebase规则

孩子数变化的Firebase规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在构建一个基于聊天的firebase web应用程序。我的结构的简化示例: |__ messages |__ room1 |__ msg1 |__ author: "" |__ message: "" |__ user1: "user1" |__ user2: "user2"

我正在构建一个基于聊天的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: ...

消息必须位于用户列表之后。

您希望在此处看到以下内容:

  • 节点必须具有
    user1
    user2
    user3
    属性
  • 这些属性的值必须作为键存在于
    /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()"
        }
    
      }
    }
    

    在这里,您需要一些东西:

  • 节点必须具有
    user1
    user2
    user3
    属性
  • 这些属性的值必须作为键存在于
    /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()"
        }
    
      }
    }
    

    你试过你给的规则了吗?因为这就是
    $
    变量的基本工作原理:该变量下的规则适用于不存在显式名称匹配的所有子节点。我通常会把用户放在
    users
    子节点下,只是为了让事情更加明确。是的,我这样做了。这里的问题是,我可以使用user1和/或user2和/或user3编写消息,也可以不使用它们全部编写消息:这是缺少的部分,用于检查它们是否都在这里。啊,这意味着您仍然希望向父节点的
    规则添加
    newData.haschilds(…)
    。我会写一个答案。你试过你给的规则了吗?因为这就是
    $
    变量的基本工作原理:该变量下的规则适用于不存在显式名称匹配的所有子节点。我通常会把用户放在
    users
    子节点下,只是为了让事情更加明确。是的,我这样做了。这里的问题是,我可以使用user1和/或user2和/或user3编写消息,也可以不使用它们全部编写消息:这是缺少的部分,用于检查它们是否都在这里。啊,这意味着您仍然希望向父节点的
    规则添加
    newData.haschilds(…)
    。我会写一个答案。也许我不够清楚。对此我很抱歉。正如我所说,$other代表user1、user2和user3;这只是一个示例,它们不是固定的子对象,而是变化的子对象,请查看我的编辑我添加了一个示例。是的,只有将所有这些子对象都放在每条消息下的
    $msgid/users
    节点中,我才会看到这一点,因为这样每个孩子也必须在
    /users
    下生存。我想简化我的示例,但实际上你完全正确,每条消息和每个用户都在一个“房间id”下。我更新了,如果还不清楚请告诉我!弗兰克,你知道吗?也许我不够清楚,抱歉。正如我所说,$other代表user1、user2和user3;这只是一个示例,它们不是固定的子对象,而是变化的子对象,请查看我的编辑我添加了一个示例。是的,只有将所有这些子对象都放在每条消息下的
    $msgid/users
    节点中,我才会看到这一点,因为这样每个孩子也必须在
    /users
    下生存。我想简化我的示例,但实际上你完全正确,每条消息和每个用户都在一个“房间id”下。我更新了,如果还不清楚请告诉我!弗兰克,有什么想法吗?