【问题标题】:Firestore Rules, allow update only certain fieldsFirestore 规则,只允许更新某些字段
【发布时间】:2020-08-17 11:59:18
【问题描述】:

我有以下数据库集合'/player_profiles/{userId}'。我想使用只有request.auth.uid == userId 的规则,除非他们只更新字段匹配,这是一个数组。我试过了,但它拒绝了权限

match /player_profiles/{userId}{
        allow write: if userId == request.auth.uid; 
      allow update: if (request.resource.data.keys().hasOnly(["matches"]) && request.auth != null);
    }

这是运行更新以将项目添加到匹配数组的 Flutter 代码:

await DatabaseProvider()
        .db
        .collection(PLAYER_COLLECTION)
        .document(widget.userProfile.userId)
        .updateData({
      'matches': FieldValue.arrayUnion([profile.userId])
    });

我是 Firestore 规则的新手,但我认为这会起作用

能够得到我想要的行为:

match /player_profiles/{userId}{
        allow write: if request.auth.uid == userId || (request.auth != null && request.resource.data.diff(resource.data).affectedKeys().hasOnly(["matches"]));
    }

看看@Doug Stevenson 的回答,尽管我可以添加确保他们只被允许将自己的 userId 放入其他人的个人资料中。

【问题讨论】:

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


    【解决方案1】:

    request.resource.data.keys() 始终包含正在写入的文档中的每个字段,无论它是否正在更新。您应该改用新的MapDiff API 来比较正在编写的内容与当前存在的内容。

    我想你会想做这样的事情:

    if
      (request.resource.data.diff(request.resource.data).affectedKeys().hasOnly(["matches"]) &&
      (request.resource.data.matches.toSet().difference(resource.data.matches) == [userId].toSet()) ||
      request.auth == null;
    

    我没有测试过,但我想你明白了。您将需要充分利用链接的 API 文档,以确保安全规则有效地处理地图、集合和列表。

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2017-10-08
      • 1970-01-01
      • 2019-03-12
      相关资源
      最近更新 更多