Firestore安全规则获取子集合文档

时间:2019-05-29 15:53:02

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

我没有足够的权限来进行此Firestore安全检查。

service cloud.firestore
{
  match /databases/{database}/documents
  {
    match /events/{eventID}
    {
      allow read:
        if get(/databases/$(database)/documents/events/$(eventID)/authorizations/$(request.auth.uid)).data.EVENT_READ == true;
    }
  }
}

获取文档在Firestore数据库中进行了硬编码,并且模拟器返回true,但对于实际查询返回的权限不足。

我测试了授权子集合并将其移动到与用户集合相同的级别,并且可以正常工作。我有什么遗漏吗?

其他测试:直接阅读文档不会导致特权不足。我正在测试以查看列表是否存在问题,但据我所知, read 应该涵盖Firestore安全规则中的 get list 。 / p>

更新:这里的清单似乎是问题所在。我试图仅用一个文档列出整个集合,这导致特权不足。

作品:

this.angularFirestore.collection('events').doc(eventID).valueChanges();

不起作用(已更新):

this.angularFirestore.collection('events', query => query.where('admins', 'array-contains', auth.uid)).valueChanges()

我的Firestore数据库:

/events/event1_id
- field 1: some string
- field 2: some string
- admins: array of uid strings
    /authorizations/<uid>  #uid for $(request.auth.uid)
    - EVENT_READ: true

更新2:更新了我尝试过的无效查询字符串。有趣的是,如果我将/ authorizations子集合移到与/ events集合相同的级别,查询将不会失败。

1 个答案:

答案 0 :(得分:0)

您的第一个查询之所以有效,是因为它正在访问特定文档的events集合。该特定文档符合规则标准,因为您已经安排get()允许它使用。

您的第二个查询不起作用,因为它试图获取events集合中的所有文档。您的规则没有明确允许。您似乎希望您的规则根据内容的未知数量的其他文档来过滤出不允许访问的事件。您需要注意security rules are not filters。请点击进入文档并阅读该部分。客户只能根据规则请求已知可读的文档。它不能依赖规则来过滤不允许的文档。

如果您希望能够查询当前用户有权访问的所有事件,那么您当前的数据库结构将无法工作。您将需要将所有相关信息放入事件集合本身。这意味着您应该考虑将允许读取事件的每个用户的UID放入文档本身,然后对该字段进行过滤。或者,您可以通过这种方式查询其他集合。