当前位置: 首页 > 知识库问答 >
问题:

Firebase FireStore:自定义管理访问

壤驷志学
2023-03-14

在Firebase Firestore中,我试图只允许(自定义分配的)管理员写/更新/删除资源,为此我有以下安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /resources {
      allow read;
      allow write, update, delete: if get(/users/$(request.auth.uid).isAdmin);
    }
    match /resources/{resource} {
      allow read;
      allow write, update, delete: if get(/users/$(request.auth.uid).isAdmin);
    }
  }
}

我正在使用users集合中标记为管理员的用户登录

NfwIQAjfNdS85yDvd5yPVDyMTUj2是从身份验证窗格中获得的UID:

共有1个答案

闽承望
2023-03-14

在写我的问题时,我让它奏效了!我犯了两个错误,如果我正确阅读文档,这两个错误都是可以避免的。

首先,所有对服务定义函数get的调用都需要在路径前缀/database/$(database)/documents/。所以这条规则:

allow write: if get(/users/$(request.auth.uid)).isAdmin;

变成这样:

allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).isAdmin;

其次,get函数将返回一个资源,然后需要调用.data来获取它所包含的实际数据。因此,与其这样做,不如:

get(/path/to/user/).isAdmin

您需要这样做:

get(/path/to/user/).data.isAdmin

现在我只希望能够将该逻辑提取到一个用户定义的函数中:

function isAdmin() {
  return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin;
}
service cloud.firestore {
  match /databases/{database}/documents {
    function isAdmin() {
      return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin == true;
    }

    // ...
  }
}
 类似资料:
  • easyopen1.4.0开始支持。 创建session 登陆成功后创建session,并返回sessionId // 自定义session @PostMapping("managedSessionLogin") public String managedSessionLogin(HttpServletRequest request) { // 假设登陆成功,创建一

  • 要使用自定义的布局管理器,我们可以重新实现 addItem(), sizeHint(), setGeometry(), itemAt() 和 takeAt()这些方法。为了确保当应用程序界面的空间非常小时,布局大小不会为 0,我们需要重载 minimumSize()方 法。日常中我们也经常看到这样的情形,即应用程序窗口的长和宽的尺寸是互为依存的,那 么我们就需要重载 hasHeightForWid

  • 获取频道自定义菜单 删除频道自定义菜单 设置频道自定义菜单

  • 使装饰器包含具有name属性的管道元数据。 此值将用于在模板表达式中调用此管道。 它必须是有效的JavaScript标识符。 实现PipeTransform接口的transform方法。 此方法接受管道的值和任何类型的可变数量的参数,并返回一个变换的(“管道”)值。 import { Component } from '@angular/core'; selector: 'app-root',

  • 7.3 自定义类的组织管理 在上一节已经讲叙了如何利用 VimL 语法实现面向对象编程的基本原理,本节进一步讨论 在实践中如何更好地使用 VimL 面向对象编程。关键是如何定义类与使用类,如何管理与 组织类代码使之更整洁。因为从某种意义讲,面向对象并不是什么新的编程技术,而是抽 象思考问题的哲学,以及代码管理的方法论。 笔者在 github 托管了一个有关 VimL 面向对象编程的项目 vimlo

  • 用户,与猫一样,常常觉得有必要标记他们的领地。 与猫不同,用户往往要定制自己的 shell 环境,如终端显示的颜色、别名等。 这通常是通过用户家目录下的一些以点开始的环境文件实现的,例如:.bash_profile。 通过修改上一节的 user::virtual::ssh_user 类,你可以将环境文件添加到基于 Puppet 的用户管理中。 在这个类中,你可以有选择地为客户提供 Puppet 文