我试图阻止我的主页视图加载用户标记的帖子。
我的数据结构如下:
"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
有人可以帮我解释一下吗?
答案 0 :(得分:3)
这是设计 Firebase 数据库时常见的绊脚石。正如文档所说,rules are not filters 所以如果你让一些子实体可读而另一些不可读,你将不再能够像你期望的那样获取 /posts。
一个简单的解决办法:当一个帖子被举报时,把它从/posts移动到/reportedPosts,这样它就不再存在于/posts下。然后在您查看帖子后,如果帖子不违反任何规则,您可以将其移回 /posts 下。这会简化您的规则,并允许用户获取帖子列表而不会看到被举报的帖子。