Javascript Firebase中已忽略验证id存在
我正在使用Firebase添加用户。我还有一个新用户,它是一个空用户,可以使用id初始化(id来自我已经做的标记) 现在,当初始化新用户时,Firebase应该检查给定的tagid是否已在用户表中使用(作为键) 这就是我的用户和新用户数据的样子 这是我正在应用的Firebase规则,它在模拟器中工作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": { ".
{
"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
值就像一个通配符变量,因此它将自动匹配该位置的任何节点名称。我已经在我的答案中添加了这个澄清。我想知道最近有人对这个答案投了反对票的原因,以便我可以改进它……这很奇怪,你的答案解释得很好,结构也很好。