代码之家  ›  专栏  ›  技术社区  ›  Troels Lenda

在Firestore规则中使用引用数据类型

  •  6
  • Troels Lenda  · 技术社区  · 6 年前

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

    uid_of_logged_in_administrator 我应该可以同时更新 items/item__1 items/item__2 -这是可行的。

    uid_of_logged_in_user 应该允许我更新 项目/项目\uu 1 但不是 项目/项目2 -但事实并非如此。

    显然,问题是我不知道数据类型是什么[ 云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
    

    因此,似乎资源。数据所有者是路径。

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

    创建此引用的原因之一是,owner属性可以是box或user。如。 {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 回复  |  直到 6 年前
        1
  •  4
  •   mono Sandeep    6 年前

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