【发布时间】: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