【发布时间】: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