【问题标题】:How to prevent firestore document fields from updating如何防止 Firestore 文档字段更新
【发布时间】:2020-12-15 22:08:00
【问题描述】:

我正在尝试为文档更新编写 Firebase 安全规则,以实现以下目标:

  1. 用户是文档的所有者
  2. 强制在请求中只显示用户名、电子邮件、修改和活动(即没有额外的字段)
  3. 防止创建的日期出现在请求中和/或被覆盖/更新

这是我的安全规则:

function isAuthenticated(){
    // Determine if the requesting user is authenticated
    return request.auth.uid != null;
}

function isUser(uid) {
    // Determine if the requesting user is the user
    return isAuthenticated() && request.auth.uid == uid;
}

function verifyFields(required, optional) {
    let allAllowedFields = required.concat(optional);
    return request.resource.data.keys().hasAll(required) &&
    request.resource.data.keys().hasOnly(allAllowedFields);
}

match /users/{uid} {
    allow read: if isUser(uid);
    allow create: if isUser(uid) && verifyFields(['username', 'email','created','modified','active'],['roles']);
    allow update: if isUser(uid) && request.resource.data.diff(resource.data).affectedKeys().hasOnly(['username','email','modified','active']);
    allow delete: if isUser(uid);

创建规则运行没有问题,但是更新规则失败,因为 request.resource.data 是一个包含所有未来文档键的映射,因此它将包含创建时文档中的所有键,例如 created 字段.

有什么想法可以强制密钥存在但也强制密钥不能更新?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    你可以这样做:

    function isUnchanged(field) {
      return request.resource.data[field] == resource.data[field]
    }
    
    allow update: if isUnchanged('created') && // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 2021-09-15
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多