【问题标题】:Is there a way to make the ternary operator work for Cloud Firestore Security Rules?有没有办法让三元运算符适用于 Cloud Firestore 安全规则?
【发布时间】:2020-02-13 22:44:36
【问题描述】:

在我们的 Firebase 设置中,我们将用户的角色存储在自定义声明中。因此,在我们的 Cloud Firestore 安全规则中,我们需要评估用户是否具有执行操作的适当角色。所以我创建了函数getRole,它可以方便地从用户的身份验证令牌中获取请求的值。但是,在某些极端情况下,用户还没有角色,在这些情况下,我希望他们的角色评估为可能的最低安全角色,在我们的例子中,这只是"user"。我阅读了 CEL(通用表达式语言)的语言规范,这是该规则语言所基于的,它实际上支持三元运算符。 (Doc)。所以我把这段代码插入到我的 Firestore 安全规则中,在线编辑器验证了规则并接受了我的新规则。但是,我后来发现,在本地运行我的安全规则单元测试并在 firebase 模拟器中加载规则时,我收到了这个错误:

ERROR Use of ternary operator not allowed

因此,要么生产版 Firestore 规则支持三元运算符而本地模拟器不支持,要么生产版正在针对 CEL 进行验证,并在不应该通过验证时通过了验证。

无论如何,我希望能够安全地拥有一个函数,该函数返回用户角色的实际值,如果未设置,则返回默认安全值。

请注意,我们试图省略 'role' in getCustomClaims() 语句,如果自定义声明中不存在密钥,它就会爆炸。

function getCustomClaims() {
  return request.auth.token;
}
function getRole() {
  return 'role' in getCustomClaims() ? getCustomClaims()['role'] : 'user';
}

【问题讨论】:

  • 对于安全规则,本地模拟器应该与云服务中的完全一样,但如果不是,您应该在 firebase-tools GitHub 上提交问题并提供重现步骤。 github.com/firebase/firebase-tools
  • 我有同样的问题,模拟器不会接受我的安全规则,因为三元运算符。您提交了问题吗?

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


【解决方案1】:

您可以在没有三元运算符的情况下完成这项工作。从rules API documentation 可以看出,request.auth.token 是一个地图类型对象。 Map 的 API 文档说有一个名为 get() 的方法,如果未找到传递的密钥,则该方法接受返回的默认(“安全”)值:

getCustomClaims().get("role", "user")

【讨论】:

  • 这是正确的做法。但是,最近引入了三元运算符,现在可供使用以供参考。 (不是问这个问题的时候)。
  • @ScottCrossen,你让三元运算符在模拟器中工作吗?
  • @Oliver 感谢您接受这个!我已经添加了三元运算符,将在下一个版本的模拟器中发布。
  • 感谢@ScottCrossen 添加?:操作。它在任何地方都有记录吗?我会将其添加到我的快速参考中:github.com/tohagan/firestore-quickreference
  • 是的!它在此页面上被记录为“操作员”firebase.google.com/docs/rules/… 但它也在规则的发行说明中firebase.google.com/support/release-notes/…
猜你喜欢
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多