我有一个Routines
集合,其中包含字段的文档programId
不应被阅读。
我有以下的存储规则:
match /Routines/{routineId=**} {
allow write: if false;
allow read: if !('programId' in resource.data);
}
当我从该集合中获取文档时,规则将按预期的方式运行,但是当我获取整个集合时,我将获取所有文档,甚至是具有programId
集合的文档。因此,似乎该规则不适用于集合。
我得到这样的集合:
const res = await firebase.firestore().collection("Routines").get();
问题是Firestore安全规则不是过滤器。请务必阅读并理解该文档以及这篇文章。您的查询正在询问Routines集合中的所有文档。安全规则将允许该请求提供所有文档,或者完全拒绝。他们不会提供与某些条件匹配的那些文档的子集。如果安全规则无法扫描所有文档的内容以检查其值-不能像Firestore那样大规模扩展。
不幸的是,这里还有第二个问题,因为实际上没有办法使您的查询与您的规则相匹配。Firestore没有提供过滤文档中字段存在的方法。您只能过滤实际存在的已知字段值。这意味着您应该考虑替代数据建模。也许您想添加一个名为“ hasProgramId”的布尔字段,并确保该字段始终为true或false,以便可以在规则和查询过滤器中使用它。
所以您的查询可能是这样的:
const res = await firebase.firestore()
.collection("Routines")
.where("hasProgramId", "==", true)
.get();
您的规则可以检查以确保客户端请求有效,如下所示:
match /Routines/{routineId=**} {
allow write: if false;
allow read: if resource.data.hasProgramId;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句