允许在firestore中对单个字段进行更新

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)

  • 现在你的函数不接收任何参数,但你发送它 `request.resource.data` :) (2认同)

Jua*_*ara 18

writeFieldsFirestore不再支持更新:最终将删除其功能.看这篇文章.

检查writeFields变量的安全规则:

allow update: if ((request.writeFields.size() == 1) && ('open' in request.writeFields));
Run Code Online (Sandbox Code Playgroud)


Sid*_*nde 6

您可以使用 :

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


Dou*_*son 5

由于 writeFields 已被弃用并且不应使用,因此您必须检查request.resource.data. 但是,它始终包含书面文档的所有字段(它的最终状态)。这意味着您必须将书面文档的所有字段与原始文档的字段进行比较,以resource.data确保只有更改的字段才是您允许更改的字段。

目前,这需要对每个可能写入的字段进行显式检查,这实现起来并不有趣。Firebase 团队正在研究如何通过允许您区分“之前”和“之后”文档的数据映射来使此类规则更易于表达。

  • 您好,关于这个主题有任何更新吗?谢谢 (2认同)