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

时间:2019-10-24 08:19:07

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

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

  • 这是我通过模拟器的安全规则,但不在我的Web应用程序内部。
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 => { ... });

屏幕截图enter image description here

1 个答案:

答案 0 :(得分:0)

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

第二条规则起作用,因为客户端查询与这些规则完全匹配。它们都要求文档ID属性为“ 1”。由于客户端正在指定过滤器,并且过滤器与规则匹配,因此可以。

我尚不清楚您的第一条规则应该允许还是拒绝。您似乎只希望允许其ID属性与其实际文档ID相同的文档。但是由于客户端实际上没有能力表达该过滤条件,因此规则只是每次都拒绝查询。