数组中子项的Firebase安全规则

时间:2016-04-01 09:53:54

标签: firebase firebase-security

我的firebase中有以下数据结构:

{
    "groups" : {
        "-KEFQ7rTQscPX4hqn6ec" : {
          "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
          "description" : "Test",
          "isPublic" : true,
          "title" : "T1"
        },
        "-KEFQao_Wd-Y-nLzIx2e" : {
          "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
          "description" : "B",
          "isPublic" : false,
          "title" : "E"
        }
}

我正在尝试实现以下目标:

  1. 每个人都可以阅读“isPublic”== true
  2. 的所有群组
  3. 只有已登录的用户才能看到他们创建的群组
  4. 我的第一个方法是:

    {
      "rules": {
        "groups": {
          ".read": true,
          "$id": {
            ".read": "data.child('isPublic').val() === true"
            }
          }
      }
    }
    

    This stackoverflow post解释了为什么它不起作用,但我无法弄清楚如何使它发挥作用。

    编辑1:

    This post有解决公共/私人问题的解决方案(我的问题),但不是第二个问题。

    编辑2:

    感谢@VonD提供公共/私人问题的工作解决方案。

    使用此解决方案解决了公共/私有问题。考虑到私人组有许多成员,并且他们的用户ID将存储在另一个数组“成员”中 - 如果我是其成员,我将如何仅允许访问该组?

    "privateGroups": {
            "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
                "-KEFQao_Wd-Y-nLzIx2e" : {
                    "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
                    "description" : "B",
                    "title" : "E",
                    "members": [userId1, userId2, userId3...]
                }
            }
        }
    

1 个答案:

答案 0 :(得分:3)

您的文档结构无法实现所需的安全规则:如果您想表达给定用户可以阅读某些给定节点的子文档,则该用户将只能以完整路径访问它们,例如" groups / -KEFQao_Wd-Y-nLzIx2e",但他将无法检索符合给定条件的组列表(除非您保持不同path用户可以访问的组列表,这意味着您将为每个用户复制所有公共组ID。

更符合firebase安全规则的文档结构将是:

{
    "publicGroups": {
        "-KEFQ7rTQscPX4hqn6ec" : {
            "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
            "description" : "Test",
            "title" : "T1"
        }
    },
    "privateGroups": {
        "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
            "-KEFQao_Wd-Y-nLzIx2e" : {
                "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
                "description" : "B",
                "title" : "E"
            }
        }
    }
} 

安全规则易于实施:

{
    "publicGroups": {
        ".read": true
    },
    "privateGroups": {
        "$userId": {
            ".read": "auth.uid === $userId"
        }
    }
}

希望它有所帮助。