【问题标题】:Firebase security rules for child items in arrays数组中子项的 Firebase 安全规则
【发布时间】:2016-04-01 09:53:54
【问题描述】:

我的 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. 只有登录的用户才能看到他们创建的组

我的第一种方法是:

{
  "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...]
            }
        }
    }

【问题讨论】:

    标签: firebase firebase-security


    【解决方案1】:

    您的文档结构无法实现所需的安全规则:如果您想表示给定用户可以读取给定节点的一些子文档,则该用户将只能使用完整路径访问它们,例如“groups/-KEFQao_Wd-Y-nLzIx2e”,但他将无法检索符合给定条件的组列表(当然,除非您在不同的路径中维护用户可以访问的组,这意味着您将为每个用户复制所有公共组 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"
            }
        }
    }
    

    希望对你有帮助。

    【讨论】:

    • 真的很有帮助!谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 2020-02-02
    • 1970-01-01
    • 2016-03-26
    • 2016-06-27
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多