Firebase规则:如果集合ID不存在,则创建

时间:2019-08-19 14:11:16

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

我想做的是创建一个Firebase规则,如果allow create中不存在ID,该规则将允许创建操作。具体来说,我使用的是Firestore,而不是Firebase实时数据库。我真的是Firebase的新手,但是在发布之前进行了一些研究。我看到的大多数示例都围绕auth。

请考虑以下数据结构。集合的名称称为flags

US - //(This is the document ID. Not auto generated
  - country: United Stages
  - name: US
  - colors: [red, white, blue]
UK - 
  - country: United Kingdom
  - name: UK
  - colors: [red, white, blue]

我要写的规则是,如果发布的数据中的name与现有的文档ID不匹配。我之所以选择设置自己的文档ID,是因为article

我当前的规则是:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    allow read: if isLoggedIn();
    allow create: if ! exists(/databases/$(database)/documents/flags/$(inComing().name))

    // functions
    function isLoggedIn() {
        return request.auth != null
    }

    function inComing() {
        return request.resource.data
    }
  }
}

但是当我尝试发布一些不存在的文档ID的数据时,出现了拒绝访问错误。我已登录到应用程序,因此我知道它在规则的第一部分没有失败。

总而言之,我的问题是:

  • 如何根据发布的数据name键检查文档ID是否存在?

所以我要尝试的是allow create: if ! exists(/databases/$(database)/documents/flags/$(inComing().name))。在模拟器中,我正在使用create,并将路径设置为flags/US。有效载荷为:

{"__name__":"/databases/(default)/documents/flags/US","id":"US","data":{"name":"US"}}

如果运行模拟器,则会拒绝访问,这是预期的。但是,如果我将路径更改为flags/CA或将有效负载更改为{"name":"CA"}(不存在),则访问将被拒绝。

0 个答案:

没有答案