在Firestore规则中使用参考数据类型

Tro*_*nda 5 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
Run Code Online (Sandbox Code Playgroud)

因此,似乎resource.data.owner是路径。

但是,如何获取此参考的ID?

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

我当然可以只添加带有用户uid的属性作为项目的字符串,而不是作为引用。但是然后我需要为框或用户作为所有者拥有两个不同的属性。

我的规则

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的数据库的结构如下

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
Run Code Online (Sandbox Code Playgroud)

mon*_*ono 4

if resource.data.owner == /databases/$(database)/documents/users/$(uid_of_logged_in_user)应该管用。