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

Firebase 如何禁止使用firestore规则更新某些字段?,firebase,google-cloud-firestore,firebase-security,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(

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

这就是我的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', “不允许3”]

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

谢谢

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

因此,对于field foo:

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

我经常在规则中使用这个小助手函数:函数isUnmodifiedkey{return request.resource.data[key]==resource.data[key]}