【问题标题】:limiting array size in security rules cloud firestore using request.resorce.data?使用 request.resorce.data 限制安全规则云 Firestore 中的数组大小?
【发布时间】:2022-08-16 19:59:09
【问题描述】:
我有以下两个安全规则,稍后检查 DB 中的文档 premiumUitill 值是否大于当前时间,这意味着溢价是有效的。
这里的问题是我要禁用数组大小的第一条规则,因此它不会超过 50 的长度,并且我正在使用 arrayUninon(data) 推送我应该检查 resource.data 而不是 request.resorce.data 的大小吗?在我的测试中,request.resource.data.arr.size() < 50 有效,但检查传入数据没有意义,因为传入的数据只有有效负载,arrayUnion() 才能使它工作?
await updateDoc(docRef, {
arr: arrayUnion(payload),
}).catch((error) => {
errorHandeling(error, \'An error has happened\', reduxDispatch, SetSnackBarMsg);
});
&& request.resource.data.arr.size() < 50
&& resource.data.premiumUntill > request.time
标签:
google-cloud-platform
google-cloud-firestore
【解决方案1】:
在 Cloud Firestore 安全规则中,resource 是指数据库中的现有文档,request.resource 是指请求中存在的文档(在写入期间,即设置或更新)。
来自data validation 的文档:
resource 变量引用请求的文档,resource.data 是存储在文档中的所有字段和值的映射。有关资源变量的更多信息,请参阅reference documentation。
写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,则 request.resource 变量包含文档的未来状态。对于只修改文档字段子集的更新操作,request.resource 变量将包含操作后的待处理文档状态。您可以检查 request.resource 中的字段值以防止不需要或不一致的数据更新:
service cloud.firestore {
match /databases/{database}/documents {
// Make sure all cities have a positive population and
// the name is not changed
match /cities/{city} {
allow update: if request.resource.data.population > 0
&& request.resource.data.name == resource.data.name;
}
}
}
另外你可以看这个video,也可以看看这个stackoverflow