firebase - Firestore 规则,使用短路来挤出读取
问题描述
这两个 Firestore 规则在我的配额中花费的读取次数是否完全不同?请注意,这样isWebAdmin()
做exists()
会占用我的阅读配额。
// example 1
match /companies/{company} {
// rule 1
allow list, write: if isWebAdmin();
// rule 2
allow get: if isInCompany(company)
// when isInCompany is true, this is short-circuited away
|| isWebAdmin();
}
对比
// example 2
match /companies/{company} {
// rule 1
allow read, write: if isWebAdmin();
// rule 2
allow get: if isInCompany(company);
}
这是我的(可能是错误的)推理:对于大多数get
请求isInCompany(company)
将是true
并且isWebAdmin()
将会是false
. 因此,在示例 2 中,即使用户被授权get
使用规则 2,规则 1 也会执行,因为get
它也是一个read
. 因此,在尝试授予管理员访问权限的同时,我为有权访问的普通用户花费了更多的阅读量。
在示例 1 中,我将它们分开get
并list
分别处理。在get
请求中,它根本不会运行规则 1。运行规则 2 时,sinceisInCompany(company)
为真,isWebAdmin()
不会因为短路而执行。因此,在常见情况下,我通过避免调用isWebAdmin()
.
它是否正确?如果是这样,只需为每个用户的常规操作添加管理员权限即可。我觉得这有点不方便。我想如果不是这种情况,我们应该只按“有效”规则收费,而不是所有经过测试的东西。是不是这样?
解决方案
使用 Firebase 安全规则,布尔表达式会短路,这是优化规则成本的有效方法。为此,请使用示例 1 中更细化的规则。
推荐阅读
- kalman-filter - 卡尔曼滤波器中的 dt
- javascript - 我可以安全地使用 javascript 中的 Number 类型进行 2 位小数的计算吗?
- sql - 无法在 SQL Azure 中运行更新查询 *无效的对象名称“DataSync.provision_marker_dss”。*
- java - Java 任务控制在尝试分析正在运行的应用程序的堆转储时出错 - java.lang.Integer 无法转换为 com.'sometxt'.JavaHeapObject
- python-3.x - Pandas 向量化条件优化
- unit-testing - 为什么 Pytest 会为每个测试方法创建一个新的类实例?
- sql - 避免在 select 子句中进行硬编码
- php - 如何突出显示使用 PHP 从 MySQL 数据库中获取的 Jquery datepicker 日期?
- python - 将多个数据框合并为一个,每个数据框作为标题名称,其中包含许多列并创建一个 3D 数据框
- raspberry-pi - 使用 ACR122U 的 libnfc 或 nfcpy 问题