Firebase中会忽略验证ID

时间:2017-10-30 12:37:19

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

我使用Firebase添加用户。我还有一个Newuser,它是一个空用户,可以使用id进行初始化(id来自我已经制作的标签)。

现在初始化 newuser 时,Firebase应检查用户表中是否已使用给定的tagid(作为密钥)。

这是我的用户 NewUser 数据的样子;

enter image description here

这是Firebase规则我应用正在模拟器中工作

{
  "rules": {
    ".read": true,
    ".write": true,
    "newuser": {
      "tagid": {
        ".validate": "root.child('users/'+newData.val()).val() === null"
      }
    }
  }
}

但出于某些原因,我可以使用Firebase REST API使用现有的tagid添加此新用户记录。 (与邮差)

1 个答案:

答案 0 :(得分:0)

您配置的规则与您正在使用的数据库结构完全匹配,因此您需要尝试更类似的内容:

{
  "rules": {
    ".read": true,
    ".write": true,
    "newuser": {
      "$pushid" : {
        ".validate": "root.child('users/'+newData.child('tagid').val()).val() === null"
      }
    }
  }
}

在上述规则中,$pushid值将与/newuser/$pushid处的任何键匹配(例如,您的-KxhGb7zZy8cZM5Pkntz键),然后使用newData.child('tagid')将获得

。来自该新数据的tagid值。

在规则中使用$location值类似于通配符变量,因此它将自动匹配该位置的任何节点名称。来自$location rules documentation

  

一个变量,可用于引用规则结构中较早使用的$location的键。

     

如果规则结构中有$location,则可以在规则表达式中使用匹配的$变量来获取正在读取或写入的实际子项的名称。

这是当前结构所必需的,因为当您添加到newuser节点时,您的有效负载看起来像这样:

{
    "newuser" {
        "$pushId": {
            "tagid": int
        }
    }
}

您可以在Rules Simulator in the Firebase database console中测试您的规则。在我的测试中,当我在数据库中已经/users/1并且我的有效负载包含tagid: 1的值时,写入被拒绝了:

simulator screenshot