【问题标题】:Using the reference data type in Firestore Rules在 Firestore 规则中使用引用数据类型
【发布时间】:2018-01-19 11:25:13
【问题描述】:

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

作为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: '/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

【问题讨论】:

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


    【解决方案1】:

    if resource.data.owner == /databases/$(database)/documents/users/$(uid_of_logged_in_user) 应该可以工作。

    【讨论】:

    • 感谢一百万 @mono。唯一缺少的部分是数据库之前的前导正斜杠。 :) 但现在可以了!
    • 哦,我弄错了。我通过添加斜线来纠正它:)
    • 我对一个项目感到困惑,试图在浏览文档后使用 get 或 exists 之类的 path() 构造函数。很明显,如果我花时间,其中斜杠形式是“'原始'形式”,并且路径构造函数采用原始形式不是的字符串,路径(路径)错误
    猜你喜欢
    • 2018-08-18
    • 2020-01-21
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多