【问题标题】:Firebase rules with number of childs varyingFirebase 规则与孩子的数量不同
【发布时间】:2019-04-15 12:10:24
【问题描述】:

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

消息必须遵循用户列表。

【问题讨论】:

  • 您是否尝试过您给出的规则?因为这基本上就是$ 变量的工作方式:其下的规则适用于不存在显式名称匹配的所有子节点。我通常会将用户放在users 子节点下,只是为了让事情更明确。
  • 是的,我做到了。这里的问题是我可以使用 user1 和/或 user2 和/或 user3 或不使用它们来写消息:这是缺少检查它们是否都在这里的部分。
  • 啊,也就是说你还想在父节点的.validate规则中添加newData.hasChildren(...)。我会写一个答案。

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


【解决方案1】:

你想要一些东西在这里:

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

你的规则的相关sn-p:

"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()"
    }

  }
}

【讨论】:

  • 也许我不够清楚,抱歉。正如我所说,$other 代表 user1、user2 和 user3;这只是一个例子,它们不是固定的孩子,而是变化的孩子,请看我的编辑我添加了一个例子。
  • 是的,如果您将所有这些都放在每条消息下的 $msgid/users 节点中,我只会看到可能,因为这样每个孩子也必须存在于 /users 下。
  • 我想简化我的示例,但实际上您绝对正确,每条消息和每个用户都在“房间 ID”下。我更新了,如果还是不清楚请告诉我!
  • 弗兰克有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多