【问题标题】:How disallow the updating of certain fields using firestore rules?如何禁止使用 Firestore 规则更新某些字段?
【发布时间】:2019-08-14 16:34:42
【问题描述】:

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

对于这种特殊情况,我的 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']))

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    所以,对于字段 foo:

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

    【讨论】:

    • 我经常在我的规则中使用这个小助手功能:function isUnmodified(key) { return request.resource.data[key] == resource.data[key] }
    猜你喜欢
    • 2020-08-17
    • 2020-09-22
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多