在Firestore Rules中使用引用数据类型

时间:2018-01-19 11:25:13

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

我想定义一条规则,允许用户只更新自己的项目,管理员更新所有项目。

作为uid_of_logged_in_administrator,我应该能够同时更新items/item__1items/item__2 - 这是有效的。

作为uid_of_logged_in_user我应该被允许更新items/item__1而不是items/item__2 - 但事实并非如此。

显然问题是我不知道数据类型[ Cloud Firestore引用]在规则中的含义。

我已阅读有关规则的文档并尝试了不同的事情。

if request.auth.uid == resource.data.owner                           | false
if request.auth.uid == resource.data.owner.id                        | false
if request.auth.uid == resource.data.owner.__id__                    | false
if resource.data.owner is string                                     | false
if resource.data.owner is path                                       | true
if resource.data.owner == path('users/uid_of_logged_in_user')        | false 
if request.auth.uid == resource.data.owner[6]                        | false

所以似乎resource.data.owner是一个路径。

但是如何获取此引用的ID?

创建此引用的一个原因是owner属性可以是框或用户。例如。 {owner: '/users/uid_of_logged_in_user'}{owner: '/boxes/box__1'}

我当然可以添加一个属性,将用户uid作为字符串添加到项目而不是作为参考。但是我需要为box或user作为所有者拥有两个不同的属性。

我的规则

service cloud.firestore {
  match /databases/{database}/documents {

    function isAdmin() {
      return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "admin";
    }
    function isAuth() {
      return request.auth.uid != null;
    }

    match /users/{uid} {
      allow read:   if isAuth();
      allow write:  if isAdmin();
    }

    match /items/{umbId} {
      allow read:   if isAuth();
      // THIS IS THE ISSUE. IT DOESENT WORK.
      allow update: if request.auth.uid == resource.data.owner 
      allow write:  if isAdmin();
    }
  }
}

我的数据库结构如下

users 
  # documentid(uid_of_logged_in_user)
    - name: 'My name'                                           // string
    - address: 'My address'                                     // string
  # documentid(uid_of_logged_in_administrator)
    - name: 'Another one'                                       // string
    - address: 'His address'                                    // string
    - role: 'admin'

items
  # documentid(item__1)
    - owner: 'users/uid_of_logged_in_user'                      // reference
    - name: 'The first item'                                    // string
  # documentid(item__2)
    - owner: 'users/uid_of_logged_in_administrator'             // reference
    - name: 'The first item'                                    // string

boxes
  # documentid(box__1)
    - name: 'First Box'                                         // string
  documentid(box__2)
    - name: 'Second box'                                        // string

1 个答案:

答案 0 :(得分:2)

ERROR: test_parse_extended (tests.test_confparser.ConfigFileParserTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/florian/metwork/mfdata/src/acquisition/tests/test_confparser.py", line 39, in test_parse_extended config_parser.read_string(content) File "/opt/metwork-mfext/opt/python2/lib/python2.7/site-packages/backports/configparser/__init__.py", line 728, in read_string sfile = io.StringIO(string) TypeError: initial_value must be unicode or None, not str 应该有用。