【问题标题】:Firebase security rules to read partial objects [duplicate]Firebase安全规则读取部分对象[重复]
【发布时间】:2019-06-03 18:04:37
【问题描述】:

我不知道如何使用 Firebase 数据库过滤数据。我读过规则不能用于过滤器。但那又如何呢?

我想要一种类似于下面的数据结构。即在指定时间由不同用户创建的帖子列表(用户 ID 不包含在下面的布局中,因为我不确定放在哪里)

posts: {
  "-LKwbZsfy55d24kwX4t1" : {
      when: {
        from: "2019-01-01 10:00",
        to: "2019-01-01 11:00"
      content: {
        text: "Hello"
      }
  },
  "-LKwbZsfy55d24kwX4t2" : {
      when: {
        from: "2019-01-02 10:00",
        to: "2019-01-02 11:00"
      content: {
        text: "Another hello"
      }
  }
}

我希望每个人都能阅读所有帖子,所以我的同步路径是“/posts”

但只有创建帖子的用户才能看到“内容”。所以我需要说帖子有“.read”:true,内容有“.read”:$uid == auth.uid(这是不可能的,因为访问不能被子路径撤销)

【问题讨论】:

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


    【解决方案1】:

    如果您当前的数据结构无法根据您的需要保护数据,请考虑对其进行重组以使安全规则成为可能。换句话说,不要将受保护的数据嵌套在公共数据下。将受保护的数据放在其自己的顶级子项中。

    "posts-public": {
        "-LKwbZsfy55d24kwX4t1": {
            // public data here
        }
    },
    "posts-private": {
        "-LKwbZsfy55d24kwX4t1": {
            // private data here
        }
    }
    

    现在您可以编写安全规则来相互独立地保护它们。

    【讨论】:

    • 叹息!我希望避免这种情况。我想这意味着我需要对 Firebase 进行两次写入,并且我必须自己创建帖子的 id(不让 Firebase 生成 id)。然后我会同时收听“posts-public”和“posts-private”,并在两个结构到达时合并它们?
    • 当然,如果您的应用需要这样做来获取所有数据。
    【解决方案2】:

    ".read": "true",给大家读取数据

    它应该看起来像这样(仅作为示例)

    "posts": {
          ".read": "true",
          "$postId": {
            ".read": "true",
            ".validate": "root.child('posts/'+$postId).exists()",
            "$contentId": {
                ".read": "auth !=null",
                ".write": "auth != null",
                ".validate": "(newData.hasChildren(['content']))",
                 "content": {
                    ".validate": "newData.val().length > 0"
                },
               "user": {
                 ".validate": "newData.hasChildren(['id', 'name', 'avatar'])"
               }
             }
          }
        },
        "privatePost": {
          "$uid1": {
            "$uid2": {
              ".read": "auth != null && ($uid1 === auth.uid || $uid2 === auth.uid)",
              "$postId": {
                ".write": "auth != null",
                ".validate": "(newData.hasChildren(['content']))",
                "content": {
                  ".validate": "newData.val().length > 0"
            },
                "user": {
                  ".validate": "newData.hasChildren(['id', 'name', 'avatar'])"
                }
              }
            }
          }
    

    【讨论】:

    • "$contentId": { ".read": "auth !=null", 不会有任何影响,因为父级中有一个 ".read:true"?
    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2020-07-11
    • 2021-09-21
    • 2017-01-10
    • 2019-02-05
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多