Google cloud firestore 使用数组包含的Where查询的Firestore Security Get生成的权限被拒绝

Google cloud firestore 使用数组包含的Where查询的Firestore Security Get生成的权限被拒绝,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我有一个文档结构,其中有一个帐户集合(_accounts),集合中的每个帐户文档都有一个子集合allowedusers。allowedusers中的文档具有访问该帐户的每个用户的文档。每个帐户文档也有一个userid字符串数组的字段,我正在使用该数组进行查询 确保根据允许的用户检查每次读取的My Firestore规则是: match /_accounts/{accountid}{ allow read: if request.auth != null && ge

我有一个文档结构,其中有一个帐户集合(_accounts),集合中的每个帐户文档都有一个子集合allowedusers。allowedusers中的文档具有访问该帐户的每个用户的文档。每个帐户文档也有一个userid字符串数组的字段,我正在使用该数组进行查询

确保根据允许的用户检查每次读取的My Firestore规则是:

match /_accounts/{accountid}{
        allow read: if request.auth != null && get(/databases/$(database)/documents/_accounts/$(accountid)/allowedusers/$(request.auth.uid)).data.allowed == true
    }
颤振中的Dart代码:

QuerySnapshot querySnapshot = await firestore.collection('_accounts').getAccounts()
   .where('userids', arrayContains: _user.id)
   .getDocuments();
上述查询产生的权限被拒绝:

PlatformException(PlatformException)(执行getDocuments时出错, 权限被拒绝:缺少或权限不足,null)

我尝试过的其他方法:

安全规则:

match /_accounts/{accountid}{
        allow read: if request.auth != null && resource.data.userids == request.auth.uid
      
    }
Dart代码:

QuerySnapshot querySnapshot = await firestore.collection('_accounts')
   .where('userids', arrayContains: _user.id)
   .limit(5)
   .getDocuments();
出于测试目的,我在_accounts集合中只有两个文档,因此我假设被拒绝的权限来自于在安全规则内使用get时达到的限制


是否有一种方法可以应用安全规则并像这样查询集合?

第一个安全规则拒绝查询,因为。关于这意味着什么。理解这个概念很重要,所以一定要阅读并理解文档

只有当安全规则能够确定查询将只查找允许的文档时,才会允许查询。它不会检查集合中的每个文档的权限,也不会筛选出不符合规则的文档。这根本无法扩展

第二条规则是拒绝访问,因为它没有正确检查数组字段。如果userids是一个数组字段,则不能像对待
resource.data.userids==request.auth.uid
那样使用相等表达式将其与字符串进行比较

如果要确保用户的UID包含在文档中,则需要将字段视为对象,并对其使用列表操作。用这个

allow read: if request.auth != null && resource.data.userids.hasAny([request.auth.uid]);

第一个安全规则拒绝查询,因为。关于这意味着什么。理解这个概念很重要,所以一定要阅读并理解文档

只有当安全规则能够确定查询将只查找允许的文档时,才会允许查询。它不会检查集合中的每个文档的权限,也不会筛选出不符合规则的文档。这根本无法扩展

第二条规则是拒绝访问,因为它没有正确检查数组字段。如果userids是一个数组字段,则不能像对待
resource.data.userids==request.auth.uid
那样使用相等表达式将其与字符串进行比较

如果要确保用户的UID包含在文档中,则需要将字段视为对象,并对其使用列表操作。用这个

allow read: if request.auth != null && resource.data.userids.hasAny([request.auth.uid]);