Firestore安全规则-获取集合时{wildcard}不为null或不为null

时间:2019-04-09 09:20:16

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

我已经在我的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中的错误?

2 个答案:

答案 0 :(得分:1)

首先,您的规则对我没有意义。检查文档ID是否不是npm install group-array import * as groupArray from 'group-array' 的目的是什么?有效的文档将没有null文档ID。


来自Queries and security rules

  

在编写查询以检索文档时,请记住安全性   规则不是过滤器-查询全部或全部。为了节省您的时间,   资源,Cloud Firestore根据潜在查询评估查询   结果集,而不是所有您的实际字段值   文件。如果查询可能返回文档,   客户端没有读取权限,整个请求失败。

在您的情况下,firestore可能认为您的查询可能会返回您可能没有阅读权限的文档。它以某种方式认为某些文档可能具有null文档ID,从而拒绝了整个请求。

当您将规则更改为null时,它就会起作用,因为Firestore对其进行了评估,并且知道该规则肯定会通过每个文档,因此授予您读取权限。

答案 1 :(得分:0)

您提出的规则不起作用,因为(如当前所实现的那样)通配符变量对于列表(查询)类型请求具有未定义的值(但对于get类型请求则未定义),因为文档ID为课程直接来自客户)。查询可能匹配多个文档,并且您的查询未指定文档ID,因此无法在规则中使用。

如果您希望规则以每个文档为基础来确定它是否属于查询结果,那么它也永远不会起作用。这是因为规则不是过滤器。所有筛选器都必须来自客户端。如果给定过滤器的任何可能存在的文档 被该规则拒绝,则整个请求将被拒绝。 (在请求时实际检查所有文档是不可扩展的,这可能会非常慢)。

换句话说,如果您想影响查询,请不要使用通配符变量。仅使用可能匹配的文档属性,并确保客户端指定了所有相关过滤器。