Firebase Firestore的集合组权限

Firebase Firestore的集合组权限,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我有以下规则: 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

我有以下规则:

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;
    }

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

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

return this.afs.collectionGroup('tokens').snapshotChanges();
我得到一个权限错误

直接在tokes/{userID}下获取文档的工作与预期的一样


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

您的规则期望安全规则将过滤所有
令牌
集合中的所有文档,以便仅读取当前用户的文档。这在安全规则中是不可能的安全规则不是筛选器。来自:

在编写查询以检索文档时,请记住安全性 规则不是过滤器,查询是全部或无。为了节省你的时间和精力 资源,云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字段与客户端要求的身份验证uid相同时,才允许访问该文档