首页 > 解决方案 > 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 中,我将它们分开getlist分别处理。在get请求中,它根本不会运行规则 1。运行规则 2 时,sinceisInCompany(company)为真,isWebAdmin()不会因为短路而执行。因此,在常见情况下,我通过避免调用isWebAdmin().

它是否正确?如果是这样,只需为每个用户的常规操作添加管理员权限即可。我觉得这有点不方便。我想如果不是这种情况,我们应该只按“有效”规则收费,而不是所有经过测试的东西。是不是这样?

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


使用 Firebase 安全规则,布尔表达式会短路,这是优化规则成本的有效方法。为此,请使用示例 1 中更细化的规则。


推荐阅读