Firebase实时数据库-如果值为空,则在读取路径时拒绝权限

时间:2018-12-13 13:44:57

标签: firebase firebase-realtime-database firebase-security-rules

我正在尝试读取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

enter image description here enter image description here

1 个答案:

答案 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
 )
"