firebase - 有没有办法让三元运算符适用于 Cloud Firestore 安全规则?

标签 firebase google-cloud-firestore firebase-security

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

错误不允许使用三元运算符

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

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

请注意,我们尝试省略 getCustomClaims() 语句中的'role',如果自定义声明中不存在该键,该语句就会崩溃。

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

最佳答案

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

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

关于firebase - 有没有办法让三元运算符适用于 Cloud Firestore 安全规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60217594/

相关文章:

android - 使用多个键检索数据 Firebase 实时数据库

android - 无法解析 : com. google.firebase :firebase-firestore:11. 4.2

swift - 如何将 SFTransscriptionSegment 数据添加到 Firebase Firestore?

firebase - 添加数据读取限制 firebase firestore

javascript - 如何设置安全规则以防止删除 firebase 中的数据?

node.js - Firebase 没有 Firebase 应用程序 [默认]

javascript - FirebaseUI 登录完成后,Firebase token 如何传递到重定向网址?

firebase - 使用 Admob 广告横幅的 Flutter 应用程序性能

javascript - firestore函数错误: Unexpected error while acquiring application default credentials

android - 存储 secret 凭证的安全方式