【发布时间】:2018-06-15 22:40:13
【问题描述】:
我们是否能够检查文档中的哪个键在 Firestore 安全规则中发生了更改?然后检查已更改的对象?我在试图弄清楚这一点时遇到了很多麻烦。很难测试。
谢谢瑞恩
【问题讨论】:
标签: angular firebase firebase-security google-cloud-firestore
我们是否能够检查文档中的哪个键在 Firestore 安全规则中发生了更改?然后检查已更改的对象?我在试图弄清楚这一点时遇到了很多麻烦。很难测试。
谢谢瑞恩
【问题讨论】:
标签: angular firebase firebase-security google-cloud-firestore
通过规则检查文档中哪些字段已更改的新规范方法是将其与现有文档进行比较:
request.resource.data.diff(resource.data).affectedKeys().hasAll(["a", "b", "c"]);
【讨论】:
writeFields 已被弃用并且行为不可靠。
writeFields 按预期工作,...affectedKeys()... 不能正常工作。我尝试了很多,但没有任何结果。
affectedKeys() 之外还有其他方法,例如addedKeys(),可能与您的用例相匹配。作为该语言的开发人员,如果您对affectedKeys() 有任何问题,请告诉我具体的故障模式,以便我修复它们! firebase.google.com/docs/reference/rules/rules.MapDiff
注意:我了解到 writeFields 并非在所有情况下都与控制台中的规则模拟器不兼容。这不包括allow create 的情况。我不再推荐这个答案。
request.writeFields 包含请求中更改的字段的键列表。 request.resource.data 包含请求中的值,resource.data 包含当前值。例如:
// Allow an update if only the name field is changing and
// only if it's not equal to the current last_name field
allow update: if request.writeFields.size() == 1
&& 'name' in request.writeFields
&& request.resource.data.name != resource.data.last_name;
【讨论】: