【问题标题】:firestore security rules get subcollection documentfirestore 安全规则获取子集合文档
【发布时间】:2019-10-15 07:01:59
【问题描述】:

我的 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;
    }
  }
}

get 文档在 firestore 数据库中硬编码,模拟器返回 true,但实际查询返回的权限不足。

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

补充测试:直接读取文档不会导致权限不足。我正在测试这是否是列表的问题,但据我所知 read 应该涵盖 getlist 在 firestore 安全规则中。

更新:列表似乎是这里的问题。我试图只用一个文档列出整个集合,结果导致权限不足。

作品:

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 集合相同的级别,查询将不会失败。

【问题讨论】:

  • “但对于实际返回的权限不足” - 请编辑问题以显示您正在做的事情与您期望的方式不符。你在做什么应该被允许的查询?

标签: google-cloud-firestore firebase-security


【解决方案1】:

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

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

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

【讨论】:

  • 最初,我尝试改用查询。我遇到了同样的问题。我更新了问题。
  • 根据您的回答,是否有意义,因为文档的读取权限基于授权子集合中的特定授权文档,我的查询可能会失败,因为可能存在返回的文档客户端没有读取权限?在这种情况下,如果我将子集合提升到同一级别,您如何解释成功读取?感谢您的帮助
  • 如果查询中请求的任何文档可能未被规则授予读取访问权限,则 Firestore 查询将失败。
猜你喜欢
  • 2018-09-26
  • 2020-12-26
  • 2021-07-17
  • 2021-02-13
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
相关资源
最近更新 更多