在 Firestore 规则中声明函数

2023-11-24

这是我现在面临的 Firestore 安全规则问题。

首先,这是我的 firestore 数据库中的数据结构示例:

userProfiles/userId/userData

companies/companyId/companyData

看起来很简单。每个userData包括一个名为companies其中包括该用户有权访问的所有 companyId。

现在我需要编写规则,仅当 companyId 位于特定用户信息公司列表中时才允许读取 companyData。

以下是规则work for me:

service cloud.firestore {
  match /databases/{database}/documents {
    match /companies/{companyId} {
      allow read: if companyId in get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
    }
  }
}

考虑到我将拥有更多规则,我想让它们更具可读性并且更易于重用。根据这个官方指南我可以创建自定义函数并根据此article它们可以是通用的并在主规则块之外声明。

我重构了我的规则,看起来像这样,它也worked for me:

service cloud.firestore {
  match /databases/{database}/documents {
    match /companies/{companyId} {
      allow read: if companyId in getUserCompanies()
    }
    function getUserCompanies() {
        return get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
    } 
  }
}

但现在我想将函数移到规则块之外以使其更加清晰:

service cloud.firestore {
  match /databases/{database}/documents {
    match /companies/{companyId} {
      allow read: if companyId in getUserCompanies()
    } 
  }
}

function getUserCompanies() {
    return get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}

但这是行不通的。没有任何错误,我只是收到常规的Read denied来自模拟器的消息。

所以问题是:是否可以像我在示例中所做的那样将函数移到外部?我在这里犯了什么明显的错误吗?有没有更好的方法让我的规则更加清晰?

附: 我还尝试向该函数传递一些参数,包括用户和公司 ID - 没有成功。


可以在规则文件中的任何级别定义函数。但它们只能访问在您定义它们的范围内定义的变量。您必须作为变量传递的任何其他内容。

所以这个(无用的)函数在全局定义时可以工作:

function isTrue() {
  return true;
}

但这个不会,因为它无权访问request:

function isAdmin() {
  return (request.auth.token.email_verified && 
    request.auth.token.email.matches(".*@google.com"));
}

我有时会在函数定义中添加一个参数:

function isAdmin(request) {
  return (request.auth.token.email_verified && 
    request.auth.token.email.matches(".*@google.com"));
}

然后将变量传递给调用:

allow update: if isAdmin(request) || 
  (request.auth.uid == uid && isUnmodified(request, resource, 'name'));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Firestore 规则中声明函数 的相关文章

随机推荐

  • 使用 pymongo 连接到 aws 时出现 ServerSelectionTimeoutError

    我正在尝试使用密钥文件连接到 AWS 实例上托管的 MongoDB 我能够通过 ssh 进入实例并连接到数据库 没有任何问题 当我尝试使用 pymongo 从远程位置连接到数据库时 我收到此错误 ServerSelectionTimeout
  • Ipython、jupyter 和内核之间有什么关系?

    就像每次我寻找有关 python 或 R 的答案时 我都会遇到 Ipython Ipython kernel Ipython Notebook jupyter 和 jupyter kernel 的这些含义 并且我实际上了解每个的用途 但我对
  • 如何修复 Heroku imagecreatefromjpeg()

    heroku 报告我一个错误 Call to undefined function imagecreatefromjpeg at line 177 其中第 177 行是 案例 jpg 案例 jpeg image data imagecrea
  • Python如何获取QLineEdit文本?

    你好世界我正在尝试让 QLineEdit 作为用户输入来工作 他们应该输入歌曲名称 输入歌曲名称后 我希望单击播放按钮后开始播放该歌曲 除了他们可以在该文件夹中输入所需歌曲的部分之外 一切正常 问题是我不确定如何制作 QlineEdit 单
  • 使用指针算术计算类型大小的替代方法

    下面的代码是100 可移植的吗 int a 10 size t size of int char a 1 char a No problem here std cout lt
  • 两个表的索引名称相同

    我正在为我们的团队构建一个小型 Mysql 数据库 对于我的数据库中的两个表 我使用了相同的索引名称 性能会受到影响吗 我做了一些测试查询 800 000 多行 到目前为止 一切顺利 索引名称特定于每个表 一张表中不能有两个同名索引 但可以
  • 如何在 Scala 中定义列表的列表?

    我想为以下类型创建一个存储 List List 2 3 1 1 List 2 2 1 但如果我执行以下操作 var y List List 1 0 2 2 List 2 1 1 2 1 然后它创建为 List AnyVal 并在我尝试执行数
  • Boost Python 中的跨模块依赖

    假设我有两个 boost python 模块 定义如下 模块A class SomeClass public SomeClass SomeClass BOOST PYTHON MODULE A class
  • 如何模拟按下按钮?

    我想测试一些表格 有没有办法模拟按下 确定 或 取消 按钮 以便按下该按钮并触发与其关联的事件处理程序 最简洁的方法是调用按钮的 Click 方法 由于以下原因 这比替代方案更好 您可以读取 OnClick 属性 检查它是否为 nil 然后
  • 编写 Maven 插件/Mojo:如何让一个目标强制执行其他目标?

    注意 此线程是关于编写自定义 Mojo 而不是使用插件 我维持一个测试插件对于马文来说 不幸的是 近一年来 我一直让这种特殊的未知挥之不去 我真的很想知道如何处理它 以便其用户可以拥有更简单的配置 假设我们的插件有两个目标 prepare
  • 应用程序作用域 bean 中的实用方法

    您认为将所有广泛使用的实用程序方法放在应用程序范围的 bean 中是一个好主意吗 在我正在开发的应用程序的当前实现中 所有实用方法 使用字符串 cookie 进行操作 检查 url 检查用户所在的当前页面等 都放在一个大请求作用域 bean
  • NHibernate 如何实现变更跟踪?

    nhibernate 代理是否做了任何聪明的工作来提高更改跟踪的效率 或者它只支持实体框架所谓的基于快照的更改跟踪 它是基于快照的 加载实体时 其状态作为 object 存储在会话中 刷新时 当前状态会转换为 object 并与原始状态进行
  • 在站点根文件夹内的文件夹中定义 HTML 根

    我想要一个包含一组新 html 文件的新文件夹 里面的所有图片都是这样的格式src image png and image png位于根文件夹中 但是当您将 HTML 文件放入新文件夹时 它找不到该图像 您必须采用以下格式src root
  • 从控制器传递图像并使用 ASP.NET MVC 3 中的 ViewBag 在视图中显示

    我想这是非常简单的事情 但我不知道如何去做 在我的控制器中我有 public ViewResult ShowForm ViewBag Title Resources ApplicationTitle ViewBag LabelStatus
  • 在 eventArgs 中发送两个字符串的语法

    在下面的代码中 我需要知道引发事件时传递两个字符串的语法 PublishEvent Click public event EventHandler
  • 如何使用 python numpy.savetxt 将字符串和浮点数写入 ASCII 文件?

    我有一组包含字符串和浮点数的列表 例如 import numpy as num NAMES num array NAME 1 NAME 2 NAME 3 FLOATS num array 0 5 0 2 0 3 DAT num column
  • matplotlib:ValueError:无效的 PNG 标头

    import matplotlib pyplot as plt 我试图在同一文件夹中的许多其他 png 照片中读取一张 png 照片 有些照片使用以下行读取时没有错误 有些则返回 ValueError 无效的 PNG 标头 可能是什么原因
  • 如何使用SQL Order By语句对结果进行不区分大小写的排序?

    我有一个 SQLite 数据库 我试图按字母顺序排序 问题是 SQLite 在排序过程中似乎没有考虑 A a 因此我得到这样的结果 A 乙 C 时间 A 乙 C G 我想得到 A A 乙 乙 C C G 时间 有哪些我不知道的特殊 SQL
  • 如何防止

    在超过页面宽度时被剪裁?

    我正在使用 jQuery Mobile 但我的一个页面出现了问题 我有一个 p 嵌入到列表中 如下所示 p div div h1 Page 1 h1 div div ul li List Heading li li p A very lon
  • 在 Firestore 规则中声明函数

    这是我现在面临的 Firestore 安全规则问题 首先 这是我的 firestore 数据库中的数据结构示例 userProfiles userId userData companies companyId companyData 看起来