我正在尝试读取Firebase Realtime数据库/users/uid1
中的路径,其中该路径的值为null
。实际上,它不存在。我的安全规则允许在该路径下阅读(以下规则)。实际读取数据时,权限被拒绝。
安全规则如下:
{
"rules": {
"users": {
"$uid": {
".read": "root.child('users').child($uid).child('mUser_Role').child('mRole_PermissionLevel').val() > 400 || root.child('users').child(auth.token.phone_number).child('mUser_Role').child('mRole_PermissionLevel').val() == 500"
}
}
}
}
尝试读取/users/uid1
为/users/myuid/mUser_Role/mRole_PermissionLevel == 500
的{{1}}失败,但权限被拒绝。
当value为true
时,Firebase如何确定应拒绝权限?不应允许此读取并返回null
返回dataSnapshot
的{{1}}吗?
我尚未在路径dataSnapshot.exists()
的{{1}}周围指定任何规则,并且当路径的值不是false
时读取成功。
编辑-要重现此场景-
1。将JSON上传到Firebase实时数据库的根目录-
data
2。 Firebase实时数据库规则(实际上用于此节点)-
null
3。使用Firbease安全规则模拟器-
模拟类型-null
位置-{
"users" : {
"+9198100xxxxx" : {
"mUser_Id" : "+9198100xxxxx",
"mUser_ProfilePicUrl" : "url",
"mUser_Role" : {
"mRole_Name" : "Employee",
"mRole_PermissionLevel" : 500
}
},
"+9198100yyyyy" : {
"mUser_Id" : "+9198100yyyyy",
"mUser_ProfilePicUrl" : "url",
"mUser_Role" : {
"mRole_Name" : "Employee",
"mRole_PermissionLevel" : 500
}
}
}
}
(模拟读取失败)
位置-{
"rules": {
"users": {
"$uid": {
".read": "root.child('users').child($uid).child('mUser_Role').child('mRole_PermissionLevel').val() > 400 || root.child('users').child(auth.token.phone_number).child('mUser_Role').child('mRole_PermissionLevel').val() == 500"
}
}
}
}
(模拟读取成功)
已认证-read
提供者-/users/+9198100zzzzz
验证令牌有效负载-
/users/+9198100yyyyy
答案 0 :(得分:2)
不存在的节点的计算结果为null
,因此您的规则的计算结果基本上为:
null > 400 || 500 == 500
所使用的规则引擎是强类型的,这意味着null > 400
会引发错误,而不是求值到false
。
解决方案是先比较节点的存在,然后再比较其值。所以:
".read": "
(
root.child('users').child($uid).exists() &&
root.child('users').child($uid).child('mUser_Role').child('mRole_PermissionLevel').val() > 400
) || (
root.child('users').child(auth.token.phone_number).exists() &&
root.child('users').child(auth.token.phone_number).child('mUser_Role').child('mRole_PermissionLevel').val() == 500
)
"