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

时间:2020-02-13 22:44:36

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

在Firebase设置中,我们将用户角色存储在自定义声明中。因此,在我们的Cloud Firestore安全规则中,我们需要评估用户是否具有执行操作的适当角色。因此,我创建了函数getRole,该函数可以方便地从用户的auth令牌中获取请求的值。但是,在某些情况下,用户还没有角色,在这种情况下,我希望他们的角色评估为最低的安全角色,在我们的情况下,这只是"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';
}

1 个答案:

答案 0 :(得分:3)

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

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