如何禁止使用Firestore规则更新某些字段?

时间:2019-08-14 16:34:42

标签: firebase google-cloud-firestore firebase-security

我有一个特定的用户角色,只允许更新某些字段。

在这种特殊情况下,我的Firestore规则如下所示:

    function isRoleUser () {
      return request.auth.token.role == 'user'
    }

    function isRoleAdmin () {
      return request.auth.token.role == 'admin'
    }

...

allow update: if signedIn() && (
        (
          isRoleUser() && (
            request.auth.uid == resource.id &&
            !(request.resource.data.keys().hasAny(['disallowed1', 'disallowed2', 'disallowed3']))
          )
        ) || (
          isRoleAdmin()
        )
      );

我遇到的问题甚至是当我不更新不允许的字段时,仍然收到消息,提示用户权限不足。

  

FirebaseError:缺少权限或权限不足。

但是,如果我删除以下行:

  

!(request.resource.data.keys()。hasAny(['disallowed1','disallowed2',   'disallowed3']))

我可以按预期更新用户,但是显然我将失去我想要施加的限制。我的规则有问题吗?如果是这样,如何防止用户更新列出的字段?

谢谢!

1 个答案:

答案 0 :(得分:1)

request.resource.data.keys()始终包含描述文档(如果写入成功)的整个字段集。它不仅包含将要更改的字段。因此,如果您想限制对某些字段的写访问,则需要检查该字段的内容在规则中是否发生了变化。对于所涉及的角色,您将必须针对每个字段分别执行此操作。

因此,对于foo字段:

request.resource.data.foo != resource.data.foo