Javascript Firebase中已忽略验证id存在

Javascript Firebase中已忽略验证id存在,javascript,firebase,firebase-realtime-database,firebase-security,Javascript,Firebase,Firebase Realtime Database,Firebase Security,我正在使用Firebase添加用户。我还有一个新用户,它是一个空用户,可以使用id初始化(id来自我已经做的标记) 现在,当初始化新用户时,Firebase应该检查给定的tagid是否已在用户表中使用(作为键) 这就是我的用户和新用户数据的样子 这是我正在应用的Firebase规则,它在模拟器中工作 { "rules": { ".read": true, ".write": true, "newuser": { "tagid": { ".

我正在使用Firebase添加用户。我还有一个新用户,它是一个空用户,可以使用id初始化(id来自我已经做的标记)

现在,当初始化新用户时,Firebase应该检查给定的tagid是否已在用户表中使用(作为键)

这就是我的用户新用户数据的样子

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

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

但出于某种原因,我可以使用Firebase REST API使用现有的标记ID添加这个新用户记录。(与Postman一起)

您配置的规则与您正在使用的数据库结构不太匹配,因此您需要尝试以下操作:

{
  "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
的键

当规则结构中有
$位置
时,可以在规则表达式中使用匹配的
$
变量来获取正在读取或写入的实际子级的名称

这是当前结构所必需的,因为当您添加到
newuser
节点时,您的负载如下所示:

{
    "newuser" {
        "$pushId": {
            "tagid": int
        }
    }
}
您可以在中测试您的规则。在我的测试中,当数据库中已经有
/users/1
并且我的负载包含
tagid:1
的值时,写入被拒绝:


您配置的规则与您正在使用的数据库结构不太匹配,因此您需要尝试类似的方法:

{
  "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
的键

当规则结构中有
$位置
时,可以在规则表达式中使用匹配的
$
变量来获取正在读取或写入的实际子级的名称

这是当前结构所必需的,因为当您添加到
newuser
节点时,您的负载如下所示:

{
    "newuser" {
        "$pushId": {
            "tagid": int
        }
    }
}
您可以在中测试您的规则。在我的测试中,当数据库中已经有
/users/1
并且我的负载包含
tagid:1
的值时,写入被拒绝:


您是否正在使用管理API创建数据?如果是这样,管理API将忽略规则;我正在使用以下指南:我不认为这是管理API,对吗?不,你说得对。你能包含你发送的请求吗?我包含的唯一数据是{“tagid”:3}。谢谢,我来看看另一个线程。您是否使用管理API来创建数据?如果是这样,管理API将忽略规则;我正在使用以下指南:我不认为这是管理API,对吗?不,你说得对。你能包含你发送的请求吗?我包含的唯一数据是{“tagid”:3}。谢谢,我来看看另一个帖子。谢谢你的回答!如何在数据库规则测试仪中获取$pushid?@Notflip在规则中使用
$location
值就像一个通配符变量,因此它将自动匹配该位置的任何节点名称。我已经在我的答案中添加了这个澄清。我想知道最近有人对这个答案投了反对票的原因,以便我可以改进它……这很奇怪,你的答案解释得很好,结构也很好。谢谢你的回答!如何在数据库规则测试仪中获取$pushid?@Notflip在规则中使用
$location
值就像一个通配符变量,因此它将自动匹配该位置的任何节点名称。我已经在我的答案中添加了这个澄清。我想知道最近有人对这个答案投了反对票的原因,以便我可以改进它……这很奇怪,你的答案解释得很好,结构也很好。