Firebase collectionGroup安全规则与文档密钥匹配

Firebase collectionGroup安全规则与文档密钥匹配,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我有一个使用云Firestore的应用程序。我正试图用Firebase安全规则保护我的数据库,并且一直在努力接收通过集合组查询查询的文档 这是我通过模拟器的安全规则,但不是在我的web应用程序中 如果我将规则硬编码为: 屏幕截图: 我不希望第一条规则在任何情况下都有效,因为它试图根据文档内容过滤文档。如果它在控制台模拟器中工作,那可能是模拟器中的错误。另外,请记住,模拟器并不模拟查询,它只是测试文档获取 第二条规则有效,因为客户端查询与规则完全匹配。它们都要求文档id属性为“1”。由于客

我有一个使用云Firestore的应用程序。我正试图用Firebase安全规则保护我的数据库,并且一直在努力接收通过集合组查询查询的文档

  • 这是我通过模拟器的安全规则,但不是在我的web应用程序中
  • 如果我将规则硬编码为:
屏幕截图

我不希望第一条规则在任何情况下都有效,因为它试图根据文档内容过滤文档。如果它在控制台模拟器中工作,那可能是模拟器中的错误。另外,请记住,模拟器并不模拟查询,它只是测试文档获取

第二条规则有效,因为客户端查询与规则完全匹配。它们都要求文档id属性为“1”。由于客户机正在指定筛选器,并且筛选器与规则匹配,因此没有问题


我不完全清楚你的第一条规则是允许还是拒绝。看起来您希望它只允许ID属性与其实际文档ID相同的文档。但由于客户端实际上无法表示该筛选条件,因此规则每次都会拒绝查询。

Hi@scarsam,我不完全确定您的用例是什么,但是不清楚为什么您有一个文档
1
,其中包含一个id字段
1
。可能是多余的。我相信你的硬核规则会发生什么是意料之中的,因为只有当值为“1”时,这个规则才会起作用。如果您的文档
2
有一个
id
字段,该字段等于
2
,那么它将只适用于硬编码值
2
,而不适用于
1
,依此类推。希望这有帮助。
match /{path=**}/groups/{groupId} {
  allow read: if resource.data.id == resource.id;
}
match /{path=**}/groups/{groupId} {
  allow read: if resource.data.id == "1" <--- hard coding the value to match my DB, this works;
}
this.db
  .collectionGroup('groups')
  .where('id', '==', id)
  .get()
  .then(snapshot => { ... });