【问题标题】:Collection Group permissions for FirestoreFirestore 的集合组权限
【发布时间】:2019-10-12 06:50:49
【问题描述】:

我有这些规则:

match /suuntoAppAccessTokens/{userName} {
      allow create: if request.auth.uid != null && request.auth.token.firebase.sign_in_provider != 'anonymous';
      match /tokens/{userID} {
        allow read, write, create, update, delete: if request.auth.uid == userID && request.auth.token.firebase.sign_in_provider != 'anonymous';
      }
    }

match /{path=**}/tokens/{userID} {
            allow read, write, create, update, delete: if request.auth.uid == userID;
    }

这意味着对于路径/suuntoAppAccessTokens/dimitrioskanellopoulos/tokens/{userID},当前用户应该具有访问权限。

但是,当我像这样查询集合组时:

return this.afs.collectionGroup('tokens').snapshotChanges();

我收到权限错误。

直接获取 tokes/{userID} 下的文档按预期工作。

我该怎么做才能使当前用户运行 collectionGroup 查询并根据我的规则获取允许他获取的项目?

【问题讨论】:

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


    【解决方案1】:

    您的规则期望安全规则将过滤所有 tokens 集合中的所有文档,以便仅读取当前用户的文档。这对于安全规则是不可能的。 安全规则不是过滤器。来自documentation

    在编写查询以检索文档时,请记住安全性 规则不是过滤器——查询是全有或全无。为了节省您的时间和 资源,Cloud Firestore 根据其潜力评估查询 结果集而不是您所有的实际字段值 文件。如果查询可能会返回文档 客户端没有读取权限,整个请求失败。

    您需要将查询更改为客户端仅请求当前用户完全可以阅读的文档。不幸的是,我无法判断您当前的模式是否可行。文档 {userId} 的 ID 不能在集合组查询中用于过滤文档。因此,您必须确保同时满足以下两个条件:

    • 您将需要文档中的某些字段来过滤以完成这项工作。
    • 您需要调整您的安全规则以完全匹配客户的要求。

    我建议将用户的uid与令牌一起存储在文档中,与规则中的{userId}相同。你可以这样查询:

    collectionGroup('tokens').where("uid", "==", uid)
    

    确保客户端传入的uid正确

    此外,您需要确保规则按照确切相同的标准授予访问权限:

    match /{path=**}/tokens/{userID} {
      allow read, write, create, update, delete:
        if request.auth.uid == resource.data.uid;
    }
    

    这将只允许在其 uid 字段与 auth uid 相同的情况下访问文档,这正是客户端所要求的。

    【讨论】:

    • 我忽略的部分是以/{path=**/开头的路径。
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多