firebase Firestore安全规则:函数和if语句

r3i60tvu  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(132)

被安全规则困住了
我有这样的角色的自定义声明:

request.auth.token.accessRules[ownerId].roles

字符串
在我的例子中,不是每个用户都有accessRules,也不是每个用户都有特定ownerId的角色。对于这些情况,我需要返回一个空列表。
我最初的简单方法是指定以下函数:

function userRoles(ownerId) {
    return request.auth.token.accessRules[ownerId].roles || []
}


但这会失败,并出现以下错误:
对象上未定义属性accessRules
好吧,很公平。
我可以检查它是否使用request.auth.token.get('accessRules', null) != null定义
所以这个函数转化为

function rolesExistsFor(ownerId) {
    return request.auth.token.get('accessRules', null) != null && request.auth.token.accessRules.get('ownerId', null) != null
}
function userRoles(ownerId) {
    return rolesExistsFor(ownerId) && request.auth.token.accessRules[ownerId].roles || []
}


但这又失败了:
类型错误。接收到:[list]预期:[bool]
在这里我意识到,在firestore规则中,逻辑操作强制两个操作数都是bool,在这种情况下,我不能返回任何东西而不是bool(就像人们通常在JavaScript中期望的那样)。
如何安全地检查并返回默认值?
有没有什么语法我漏掉了,或者我真的做不到?
另一方面,当声明不存在时,规则将崩溃并给予“访问拒绝”,这是预期的最终结果。

falq053o

falq053o1#

接受生成错误的规则评估以简单地拒绝请求是正常的。您不需要检查任何错误,除非您想决定下一步如何处理该错误。并且允许失败发生没有真实的缺点。

相关问题