阵列中子项的Firebase安全规则

阵列中子项的Firebase安全规则,firebase,firebase-security,Firebase,Firebase Security,我的firebase中有以下数据结构: { "groups" : { "-KEFQ7rTQscPX4hqn6ec" : { "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c", "description" : "Test", "isPublic" : true, "title" : "T1" }, "-KEF

我的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"
        }
}
我正在努力实现以下目标:

  • 每个人都可以阅读“isPublic”==true的所有组
  • 只有登录的用户才能查看他们创建的组
  • 我的第一个方法是:

    {
      "rules": {
        "groups": {
          ".read": true,
          "$id": {
            ".read": "data.child('isPublic').val() === true"
            }
          }
      }
    }
    
    解释了为什么它不起作用,但我不知道如何才能使它起作用

    编辑1:

    对公共/私人问题(我的1.问题)有解决方案,但对第二个问题没有

    编辑2:

    感谢@VonD为公共/私人问题提供的有效解决方案

    有了这个解决方案,公共/私有的问题就解决了。考虑到一个私有组有许多成员,并且这些成员的用户ID将存储在另一个数组“members”中,我如何仅允许在我是成员时访问该组

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

    您的文档结构无法实现所需的安全规则:如果您希望表示给定用户可以读取给定节点的部分子文档,则用户只能使用其完整路径访问这些子文档,例如“groups/-KEFQao_Wd-Y-nLzIx2e”,但他将无法检索与给定条件匹配的组列表(当然,除非您在不同路径上维护用户可以访问的组列表,这意味着您将为每个用户复制所有公共组ID)

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

    {
    “公共团体”:{
    “-KEFQ7rTQscPX4hqn6ec”:{
    “createdBy”:“b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c”,
    “说明”:“测试”,
    “标题”:“T1”
    }
    },
    “私人团体”:{
    “b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c”:{
    “-KEFQao_Wd-Y-nLzIx2e”:{
    “createdBy”:“b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c”,
    “说明”:“B”,
    “标题”:“E”
    }
    }
    }
    } 
    
    安全规则将很容易实施:

    {
    “公共团体”:{
    “.read”:正确
    },
    “私人团体”:{
    “$userId”:{
    .read:“auth.uid==$userId”
    }
    }
    }
    

    希望有帮助。

    所需的安全规则无法在您的文档结构中实现:如果您希望表示给定用户可以读取给定节点的部分子文档,则用户只能使用其完整路径访问它们,例如“groups/-KEFQao_Wd-Y-nLzIx2e”,但他将无法检索与给定条件匹配的组列表(当然,除非您在不同路径上维护用户可以访问的组列表,这意味着您将为每个用户复制所有公共组ID)

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

    {
    “公共团体”:{
    “-KEFQ7rTQscPX4hqn6ec”:{
    “createdBy”:“b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c”,
    “说明”:“测试”,
    “标题”:“T1”
    }
    },
    “私人团体”:{
    “b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c”:{
    “-KEFQao_Wd-Y-nLzIx2e”:{
    “createdBy”:“b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c”,
    “说明”:“B”,
    “标题”:“E”
    }
    }
    }
    } 
    
    安全规则将很容易实施:

    {
    “公共团体”:{
    “.read”:正确
    },
    “私人团体”:{
    “$userId”:{
    .read:“auth.uid==$userId”
    }
    }
    }
    

    希望有帮助。

    真的很有帮助!谢谢!:)这真的很有帮助!谢谢!:)