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。
我试图阻止我的主页视图加载用户标记的帖子。
我的数据结构如下:
"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。