Firebase 数据库安全规则块帖子

时间:2021-01-29 09:50:51

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

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

我的数据结构如下:

    "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"        
      }

但是我得到了

<块引用>

/dev/posts 的监听器失败:permission_denied

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

1 个答案:

答案 0 :(得分:3)

这是设计 Firebase 数据库时常见的绊脚石。正如文档所说,rules are not filters 所以如果你让一些子实体可读而另一些不可读,你将不再能够像你期望的那样获取 /posts。

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