pro*_*bie 7 firebase-security google-cloud-firestore firebase-security-rules
我想让用户有权更新文档.但仅限用户更新此文档的一个特定字段.此用户不应更改所有其他字段.
这可能在火店吗?
我试过这样的事情:
function isUpdateToOpenField(attr) {
return attr == get(/databases/$(database)/documents/stores/$(store)).data.open;
}
allow update: if isUpdateToOpenField(request.resource.data);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何比较更新是否对应于正确的字段.
Sco*_*sen 33
规则语言中的地图差异被引入来解决这个问题:
function isUpdateToOpenField() {
return request.resource.data.diff(resource.data).affectedKeys().hasOnly(['open']);
}
allow update: if isUpdateToOpenField();
Run Code Online (Sandbox Code Playgroud)
Jua*_*ara 18
writeFields
Firestore不再支持更新:最终将删除其功能.看这篇文章.
检查writeFields
变量的安全规则:
allow update: if ((request.writeFields.size() == 1) && ('open' in request.writeFields));
Run Code Online (Sandbox Code Playgroud)
您可以使用 :
allow update: if request.resource.data.diff(resource.data).affectedKeys().hasOnly(["fieldToBeUpdated"]);
Run Code Online (Sandbox Code Playgroud)
或者
allow update: if request.resource.data.diff(resource.data).affectedKeys() == ["fieldToBeUpdated"].toSet;
Run Code Online (Sandbox Code Playgroud)
您可以根据您的用例替换affectedKeys()
为addedKeys()
,removedKeys()
或。changedKeys()
affectedKeys()
顾名思义,相当于三者一起使用。
有关更多详细信息,请阅读此处的文档https://firebase.google.com/docs/reference/rules/rules.MapDiff
由于 writeFields 已被弃用并且不应使用,因此您必须检查request.resource.data
. 但是,它始终包含书面文档的所有字段(它的最终状态)。这意味着您必须将书面文档的所有字段与原始文档的字段进行比较,以resource.data
确保只有更改的字段才是您允许更改的字段。
目前,这需要对每个可能写入的字段进行显式检查,这实现起来并不有趣。Firebase 团队正在研究如何通过允许您区分“之前”和“之后”文档的数据映射来使此类规则更易于表达。
归档时间: |
|
查看次数: |
2118 次 |
最近记录: |