【问题标题】:can I do something like if else statement in firestore security rules to set different action?我可以在 firestore 安全规则中执行 if else 语句来设置不同的操作吗?
【发布时间】:2019-12-25 04:50:29
【问题描述】:

在我的文档中,有 3 个属性:价格、容量、标题。我只想要可以更新容量的版主。我正在使用自定义声明来区分普通用户或版主。

function isAModerator() {
    return request.auth.token.moderator == true
}

但我不知道如何在 firebase 安全规则中执行 if else 语句,我想做这样的事情

if (aModerator) {
   canUpdateCapacity()
} else {
   canNotUpdateCapacity()
}

我已经阅读了这个Possible to do a If Else or a Switch Statement Firestore Rules,但它与我的情况不同,因为它使用 Map,map 的键必须在字符串中

【问题讨论】:

  • 另一个问题中的建议仍然适用。您必须使用逻辑 AND 和 OR 语句为权限返回单个布尔值。安全规则没有“做某事”。每个表达式都必须计算为布尔值。

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

没有明确的“if-else”语法。

对于您的用例,可以通过应用容量无法更改的限制来实现您想要的结果,但如果用户是版主,也允许该条件失败:

service cloud.firestore {
  match /databases/{database}/documents {

    function isAModerator() {
      return request.auth.token.moderator == true
    }

    // Make sure only moderators can change capacity
    match /items/{item} {
      allow update: if request.resource.data.capacity == resource.data.capacity
                    || isAModerator()
    }
  }
}

这里的|| 是一个或运算。您也可以使用 && 进行 AND 运算。

锻炼

这个结果是使用布尔算法实现的。

if (aModerator) {
  return true; // no restriction
} else {
  return enforceRestrictions(); // allow only if restrictions are satisfied
}

可以改写为

(aModerator && true) || (!aModerator && enforceRestrictions())

可以简化为

aModerator || (!aModerator && enforceRestrictions())

可以扩展为

(aModerator || !aModerator) && (aModerator || enforceRestrictions())

可以简化为

true && (aModerator || enforceRestrictions())

变成了

aModerator || enforceRestrictions()

【讨论】:

  • 简化规则总结here。使用的符号是 用于 OR (||) 和 用于 AND (&&)
  • 如果您还想将更新限制为登录用户,您可以使用isLoggedIn() && (request.resource.data.capacity == resource.data.capacity || isAModerator())
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多