Firebase 数据库安全规则块帖子

Firebase Database Security Rule Block Posts

我试图阻止我的主页视图加载用户标记的帖子。

我的数据结构如下:

    "reportedPosts" : {
        "HtnULzU0lnZKYva2M2Wepl6N8wE3" : {
            "reported" : true,
        },
        "boX6rtJ98haWVxNoXfSq21maCVU2" : {
            "reported" : true,
        },
    },

    "posts" : {
        "HtnULzU0lnZKYva2M2Wepl6N8wE3" : {
            "details" : "abc",
        },
        "boX6rtJ98haWVxNoXfSq21maCVU2" : {
            "details" : "abc",
        },
        "jSMSkY9rHtdNkXoLrsFmCAXdY9n2" : {
            "details" : "abc",
        },
        "jnFhJbgCjZeJFx0hspObqoskQej2" : {
            "details" : "abc",
        },
        "r6KPesUr1qORfIJke07SloZHeNW2" : {
            "details" : "abc",
        }
    }

我的安全规则:

      "posts": {
        ".indexOn": "datestamp",
        "$post_id" : {
          // only load posts not reported
          ".read": "auth != null && !root.child('reportedPosts').hasChild($post_id)",
          ".write": "auth != null"           
        }               
      },     

      "reportedPosts" : {
        ".read": "auth != null",       
        ".write": "auth != null"        
      }

不过我得到了

Listener at /dev/posts failed: permission_denied

有人可以帮我解释一下吗?

这是设计 Firebase 数据库时常见的绊脚石。正如文档所说,rules are not filters 因此,如果您使某些子实体可读而其他子实体不可读,您将无法再像您期望的那样获取 /posts。

一个简单的解决方案:当一个post被报告时,把它从/posts移到/reportedPosts,这样它就不再存在于/posts下。然后,在您查看 post 之后,如果 post 没有违反任何规则,您可以将其移回 /posts 下。这简化了您的规则,并允许用户获取 post 的列表而不会看到报告的 post。