如果安全规则参数不是查询的一部分,为什么firestore抛出权限被拒绝



我知道,对于我的集合中的每个doc,如果request.resource.data.foo === bar ,则request.auth.uidrequest.resource.data.users

// security rule
match /collection/{id}/{document=**} {
   allow read: if request.auth.uid in request.resource.data.users;
}
// does not work
const snapshot = await collectionRef.where("foo", "==", "bar").get()
// works
const snapshot = await collectionRef.where("foo", "==", "bar").where("users", "array-contains", userID).get()

即使集合中的每个文档都满足安全规则firestore抛出permission denied。一旦我添加了额外的users-query参数子句,查询就可以工作了。

涉及查询字段过滤器的安全规则不会检查文档的实际内容。对于大规模的收藏来说,这根本无法扩大规模。Firestore中的每个查询都必须能够大规模扩展。

安全规则所做的是检查查询是否没有请求规则明确不允许的任何内容。你的规则实际上是说";不允许任何人在collection上进行查询,除非在字段uid上有一个包含过滤器的数组,在那里他们提供由Firebase Auth"验证的实际uid";。

您的第一个查询没有指定所需的筛选器,因此会立即被拒绝。您的第二个查询确实指定了所需的筛选器,因此它通过了。同样,任何文档的内容都无关紧要。

我建议也仔细阅读这部分文件。

最新更新