翻转OR条件会在Firebase实时规则中返回错误的访问

时间:2019-09-01 16:39:44

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

我正在学习Firebase的安全性规则,但是当我翻转OR条件时,我看到了一些奇怪的东西,它返回true作为例外,否则返回错误

这是JSON树

{
  "-LnOK0641vZRqJ1k5tCc" : {
    "category" : "Sports",
    "eq" : "ndndnjelwjdjrkeldnhfkelenjrkkee\n",
    "id" : 4,
    "instruction" : "nfhrjejwkldjfjejejhdhejejejejje",
    "title" : "title11",
    "username" : "bdjsjd"
  },
  "-LnOby-AZv2D-FkgBopU" : {
    "category" : "Sports",
    "eq" : "bdnwjksbxksndjejwldjjdjekwldnd",
    "id" : 5,
    "instruction" : "hejelwldhfhekekdhdjejekdk",
    "title" : "bsndnfhdkwmsbdjs",
    "username" : "bdjsjd"
  },
  "-LnOc2Y5DT5XvwJv6NJu" : {
    "category" : "Sports",
    "eq" : "ndnskajdhfiwldhdoelw",
    "id" : 6,
    "instruction" : "jsksksklfhfjejeksjfjiei",
    "title" : "5ndnsjsndbdkwlaldhjd",
    "username" : "bdjsjd"
  }  
}

Firebase规则返回数据时


"$uid" : {
".read" : true,
".write" : "((!data.exists() && auth != null) || (auth.uid == root.child('Users').child(data.child('username').val()).child('uid').val()))"
      }

Firebase拒绝返回

"$uid" : {
 ".read" : true,
 ".write" : "((auth.uid == root.child('Users').child(data.child('username').val()).child('uid').val()) || (!data.exists() && auth != null) )"

      }

我只翻转OR,结果不一样

编辑 当我使用管理员权限时,被拒绝的人将返回允许的访问权限

1 个答案:

答案 0 :(得分:1)

在评估安全规则中的条件时出错时,整个规则将立即失败。

在第一个规则集中,您可以正确地防止错误,因此规则引擎将评估:

!data.exists() && auth != null) || 

如果没有数据,也没有经过身份验证的用户,则它将允许操作(因为您有||)。

在第二个规则集中,您的情况始于:

auth.uid == ...

如果没有经过身份验证的用户,则不存在authnull并且auth.uid引发错误,从而导致操作被拒绝。