我正在尝试制定一个Firestore规则,该规则将检查用户是否是“父”集合的所有者。
我有这样的结构:
-> [饮食] 文档的集合->(所有者:“所有者”) | subCollection-> [Food] 文档->(名称:“ Carrot”)
我希望可以使用[Diet]文档的doc属性在[Food]子集合中读写文档。
此版本有效,但它仅检查请求的源,而不总是检查[Diet]。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents{
match /diets/{id}/{id2=**} {
allow read, write: if resource.data.owner == request.auth.uid;
}
}
}
即使父级(Diet doc本身)是请求的来源,此版本也无法使用。检查饮食中的DOC时,该解决方案是否应该与先前的解决方案相同?
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents{
match /diets/{id}/{id2=**} {
allow read, write: if get(/databases/$(database)/documents/diets/$(id)).data.owner == request.auth.uid;
}
}
}
在检查Diet文档时,该解决方案是否应该与上一个解决方案相同?
它可以在模拟器中运行,即使请求子集合文档,也一切正常,但是我的应用程序出现“ FirebaseError:缺少权限不足”错误。
这是我的应用程序的代码。
firebase.firestore().collection("diets").where("owner", "==", this.userID).get()
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc);
console.log(doc.id, " => ", doc.data());
});
})
.catch(function(error) {
console.log("Error getting documents: ", error);
});
控制台模拟器只能模拟单个文档的获取。当前无法模拟集合查询,这些查询的处理方式不同。
您遇到的问题是安全规则不是筛选器。我强烈建议您阅读该文档以及本文。您的第一个规则起作用的原因是,该规则可以非常轻松地检查查询的过滤器是否匹配规则中返回的所有可能文档的约束。查询不可能要求的内容超出规则明确允许的范围。但是,当您涉及时get()
,该规则将不会对get()
集合中的每个文档进行评估,因为对于大型集合而言,这将非常慢。它不会尝试通过检查get()
每个文档的结果来过滤文档。
该规则适用于单个文档,因为它不涉及筛选-仅检查单个文档-完全在该规则的能力范围内。
再次,诀窍是从大规模规则的角度看待这一点。如果您在一个集合中有数十亿个文档,那么逐个检查每个文档将根本表现不佳,因此该规则将拒绝它。该规则只能真正检查查询过滤器是否匹配规则的特定约束,而不检查每个文档。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句