我已经在我的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中的错误?
答案 0 :(得分:1)
首先,您的规则对我没有意义。检查文档ID是否不是npm install group-array
import * as groupArray from 'group-array'
的目的是什么?有效的文档将没有null
文档ID。
在编写查询以检索文档时,请记住安全性 规则不是过滤器-查询全部或全部。为了节省您的时间, 资源,Cloud Firestore根据潜在查询评估查询 结果集,而不是所有您的实际字段值 文件。如果查询可能返回文档, 客户端没有读取权限,整个请求失败。
在您的情况下,firestore可能认为您的查询可能会返回您可能没有阅读权限的文档。它以某种方式认为某些文档可能具有null
文档ID,从而拒绝了整个请求。
当您将规则更改为null
时,它就会起作用,因为Firestore对其进行了评估,并且知道该规则肯定会通过每个文档,因此授予您读取权限。
答案 1 :(得分:0)
您提出的规则不起作用,因为(如当前所实现的那样)通配符变量对于列表(查询)类型请求具有未定义的值(但对于get类型请求则未定义),因为文档ID为课程直接来自客户)。查询可能匹配多个文档,并且您的查询未指定文档ID,因此无法在规则中使用。
如果您希望规则以每个文档为基础来确定它是否属于查询结果,那么它也永远不会起作用。这是因为规则不是过滤器。所有筛选器都必须来自客户端。如果给定过滤器的任何可能存在的文档 被该规则拒绝,则整个请求将被拒绝。 (在请求时实际检查所有文档是不可扩展的,这可能会非常慢)。
换句话说,如果您想影响查询,请不要使用通配符变量。仅使用可能匹配的文档属性,并确保客户端指定了所有相关过滤器。