【问题标题】:Firebase how to write security rule for a child that is 2 level random id deep in the treeFirebase如何为树中2级随机ID的孩子编写安全规则
【发布时间】:2018-08-19 07:02:58
【问题描述】:

我有一个名为 (people) 的数据库节点,如下所示:

    people
    |
    |
    -------UserID1 //which is a random id
    |       |
    |       |
    |        ----UserId2 //which is a random id
    |            |
    |            |
    |            name:"some_name"
    |            id:"UserId2"
    |            image:"image_url" 
    |
    | 
    |
    -------UserId2
            |
            |
             ----UserId3
                 |
                 |
                 name:"some_name"
                 id:"UserId3"
                 image:"image_url"  

如果我们查看 (people / UserID1 / UserId2) 节点

由于 UserId1 和 UserId2 是 2 个随机 id,那么如果我们要向 UserId2 写入规则,我们会注意到它是 2 个随机 id 级别的深度。

我想要的是在这个指定的路径上写一条规则,上面写着:

1) people / UserId1 : 可以由 (UserID1) 和 (UserId2) 写入。

2) people / UserId1 : 可以被 (UserID1) 和 (UserId2) 读取。

3) people / UserId1 / UserId2 :必须以具有 (name, id, image) 的 newData 结尾。

我该怎么做?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    由于 Firebase 实时数据库规则 cascade 进入更深的密钥的方式,不建议允许 people/UserId1 可被 UserId2 写入,因为这将允许 UserId2 对存储在下面的其他用户的数据进行写入访问people/UserId1 喜欢people/UserId1/UserId3

    但是使用这个特性,我们可以在深入研究数据结构时“添加”允许读写权限的用户。

    所以新的条件是:

    • people/UserId1 - UserId1 具有读写权限
    • people/UserId1/UserId2 - UserId2 具有读写权限
    • people/UserId1/UserId2 - 必须始终包含“name”、“id”和“image”键
    • people/UserId1/UserId3 - UserId2 无法读取/写入
    {
    "rules": {
      "people": {
        "$userId1": {
          "$userId2": {
            ".read": "auth.uid == $userId2", // add $userId2 to those granted read permission, cascades into deeper keys
            ".write": "auth.uid == $userId2", // add $userId2 to those granted write permission, cascades into deeper keys
            ".validate": "newData.hasChildren(['name', 'id', 'image'])" // any new data must have 'name', 'id' and 'image' fields.
          },
          ".read": "auth.uid == $userId1", // add $userId1 to those granted read permission, cascades into deeper keys
          ".write": "auth.uid == $userId1" // add $userId1 to those granted write permission, cascades into deeper keys
        }
      }
    }
    

    最后,如果还要求people/UserId1/UserId2/id 等于UserId2,您可以更改".validate" 规则来强制执行:

    ".validate": "newData.hasChildren(['name', 'id', 'image']) && newData.child('id').val() == $userId2" // any new data must have 'name', 'id' and 'image' fields and 'id' must have a value of $userId2
    

    【讨论】:

      猜你喜欢
      • 2019-10-19
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2016-09-29
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多