Google cloud firestore Firestore安全规则-如何保护子集合?

Google cloud firestore Firestore安全规则-如何保护子集合?,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我想问,保护Firestore子集合的最佳方法是什么 这里是我的问题:我有一个用户集合,其中有一个名为用户id的文档。我在该文档中还有一个集合,其中包含一些信息,包括用户id(再次)。是否有一种简单的方法可以访问嵌套在用户文档子集合中的每个文档 到目前为止,我写了以下内容。我可以访问第一个文档(称为i6mg…但第二个称为DxDt…) 额外问题:是否有一种方法可以保护所有文档,而不必在每个文档中都包含用户id 谢谢 编辑 谢谢道格的建议。我添加了以下代码,可能还遇到了一些其他问题 rules_ve

我想问,保护Firestore子集合的最佳方法是什么

这里是我的问题:我有一个用户集合,其中有一个名为用户id的文档。我在该文档中还有一个集合,其中包含一些信息,包括用户id(再次)。是否有一种简单的方法可以访问嵌套在用户文档子集合中的每个文档

到目前为止,我写了以下内容。我可以访问第一个文档(称为i6mg…但第二个称为DxDt…)

额外问题:是否有一种方法可以保护所有文档,而不必在每个文档中都包含用户id

谢谢

编辑 谢谢道格的建议。我添加了以下代码,可能还遇到了一些其他问题

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
        match /users/{uid}/{document=**} {
          allow read: if uid == request.auth.uid;
          allow write: if uid == request.auth.uid;
        }
  }
}
看起来我给了我的用户访问子集合的权限,而不是访问主集合的权限。例如,下面的代码不生成结果,它捕获异常

await Firestore.instance.collection('users').where('userId', isEqualTo: userId).limit(1).getDocuments();
有什么建议吗


如果您使用用户的UID作为其顶级文档的ID,并且如果希望所有子集合中的所有文档都具有与该文档相同的访问权限,请使用递归通配符:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid}/{document=**} {
      allow read: if uid == request.auth.uid;
    }
  }
}

必须使用安全规则版本2才能获得递归通配符语法。请注意,常规通配符只是成为可以直接在规则中使用的变量。您不必像现在这样进入文档字段。

Doug Stevenson,起初我忘了添加“rules_version='2',但它仍然有效。怎么可能呢?如果我添加了版本2,那么它就不起作用了。以下是我尝试访问用户集合时在flift中出现的错误:PlatformException(错误7,FIRFirestoreErrorDomain,缺少或权限不足)。它适用于子集合,但不适用于主集合。明白!那么,对于如何添加一个规则来授予主用户集合的读取权限,您有什么建议吗?我希望每个用户都能阅读users集合中的文档(命名为uid),以及任何子集合中的所有其他文档。我显示的内容适用于规则版本2。你是说你不能使用版本2吗?您必须更具体地说明您正在做的事情没有按预期的方式工作。您的查询现在对规则无效。我提出的规则只允许UID匹配的单个文档get()。如果您已经知道文档的ID,则无需使用where子句执行查询。如果确实需要允许对userID字段进行筛选,则需要调整规则以查看文档字段和文档ID。
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid}/{document=**} {
      allow read: if uid == request.auth.uid;
    }
  }
}