【问题标题】:How to lock down Firestore collection group queries based on the resource path via Firestore Security Rules如何通过 Firestore 安全规则根据资源路径锁定 Firestore 集合组查询
【发布时间】:2019-09-23 17:47:43
【问题描述】:

我正在应用中实现 Firestore 集合组查询,并且我想制定一个安全规则来锁定拥有他们尝试查询的资源的用户的访问权限

Firestore 中的数据结构类似于 users/1234/.../posts/5678。我想提取正在通过集合组查询的资源的路径,然后将提取的 userId(在本例中为 1234)传递到我的 signedIn() 方法中,该方法仅根据自定义令牌检查 userId。我知道这个signedIn() 方法可以正常工作,因为我还有其他依赖它的规则可以正常工作。

我在我的 firestore.rules 文件中尝试了以下内容:

// collection groups
match /{path=**}/posts/{post} {
  allow read: if resource['__name__'][0] == "users" && signedIn(resource['__name__'][1])
}

// collection groups
match /{path=**}/posts/{post} {
  allow read: if path[0] == "users" && signedIn(path[1])
}

不幸的是,当我尝试查询posts 集合组时,我仍然会遇到权限被拒绝错误。我什至找不到任何调试的好方法,因为仪表板中的模拟器似乎对集合组查询不是很有用。

附:我知道我可以在post 文档中添加userId 字段,然后编写如下规则:

// collection groups
match /{path=**}/posts/{post} {
  allow read: if signedIn(resource.data.userId)
}

事实上,我已经尝试过了,并且成功了。但出于商业原因,如果可能的话,我宁愿不这样做。

【问题讨论】:

  • 我也没有让它工作,但我相当肯定你使用的是resource['__name__']“错误”:从规则游乐场我可以看到前三个部分是/databases/%28default%29/documents/ ,所以如果你想要users,那么你会寻找resource['__name__'][3]而不是[0]。起初我的猜测是,对于 collectionGroup 查询,您无法检查资源,因为这将需要检查每一个潜在的命中 - 大量读取(目前每个安全规则检查的最大值为 20)。但如果你让它与resource.data 一起工作,那么我不知道发生了什么

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


【解决方案1】:

您是否试图限制进行 db 调用的用户只允许他们查看属于该用户的帖子?

这是 firestore 规则中 signedIn 方法的样子:

function signedIn() {
  return request.auth.uid != null;
}

以及一种限制用户只能在与他们的 uid 相同的路径中进行 crud 操作的方法

match /users/{userId}/posts/{postsId} {
  allow create, read, update: if request.auth.uid == userId && signedIn();
}

【讨论】:

  • 正确,这就是我想要做的。不过有皱纹。我需要使用collection group queries 来查询posts 的多个子集合。不幸的是,这意味着您上面显示的方法在这种情况下不起作用
  • @JeffJohnson - 你有没有找到解决方案?我也有类似的情况,得出的结论是基于路径的规则和集合组查询不能混用。您的数据设计可以使用其中之一,但不能同时使用两者。想法?
  • @CliffChaney 我最终只是将userId 添加到文档中,并通过我原始帖子底部的方法进行检查。后端将这些信息添加到文档中并不太难,所以我选择了阻力最小的路径。我从来没有让其他任何东西工作
猜你喜欢
  • 2021-07-17
  • 1970-01-01
  • 2021-12-27
  • 2023-03-14
  • 1970-01-01
  • 2021-03-25
  • 2021-08-12
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多