【发布时间】:2019-04-09 09:20:15
【问题描述】:
我已经在我的 firestore 上设置了一个读取规则,它在通过 id 对单个文档执行获取时工作正常,但在获取集合时失败并出现 FirebaseError: Missing or insufficient permissions. 错误。
查询集合时好像是路径中的通配符没有正确绑定。我已经归结为一个最小的示例,从逻辑上讲,我认为它不应该使许可失败,但确实如此。 如下:
数据(格式化,但当然是在集合/文档中组织):
"items": { // collection "items"
"item1" : { // document "item1"
"name": "first item" // just dome dummy data
}
}
规则:
service cloud.firestore {
match /databases/{database}/documents {
match /items/{itemId} {
allow read: if itemId != null;
}
}
}
我用来访问数据库的代码(打字稿)
// This line works fine, returns the document
firebase.firestore().collection("/items").doc("item1").get()
// This line gets a "FirebaseError: Missing or insufficient permissions." error
firebase.firestore().collection("/items").get()
我已尝试将规则更改为
allow read: if itemId != null || itemId == null;
这在逻辑上应该总是正确的。但是,结果仍然相同,这让我相信绑定到 itemId 通配符时存在一些问题。
作为健全性检查,我还将规则更改为
allow read: if true;
现在集合上的get() 和文档都可以正常工作(如预期的那样),没有任何权限错误。
所以我在这里遗漏了什么,或者这是 Firestore 中的错误???
【问题讨论】:
-
您希望此规则何时会明确拒绝访问?在我看来,您没有明确的拒绝案例,这意味着您的规则一开始就没有太多目的。
-
当然我的域比这更复杂,我只是将问题归结为最少的代码集来重现问题。主要问题是绑定通配符/文档 id 的问题使我无法制定任何有意义的访问规则。而且我在文档中没有看到通配符仅适用于获取单个文档而不是集合查询。
-
我认为最好(出于这个问题的目的)用一个不符合您期望的真实规则来展示您在此处实际尝试完成的工作。如果你的规则没有明确的目的,就很难说你是否正确地考虑了这个问题。
-
好点,应该这样做。只是想让它变得简单,因为我认为我已经缩小到问题所在,并且不想让问题变得混乱
标签: firebase google-cloud-firestore firebase-security