我使用Firebase添加用户。我还有一个Newuser,它是一个空用户,可以使用id进行初始化(id来自我已经制作的标签)。
现在初始化 newuser 时,Firebase应检查用户表中是否已使用给定的tagid(作为密钥)。
这是我的用户和 NewUser 数据的样子;
这是Firebase规则我应用正在模拟器中工作
{
"rules": {
".read": true,
".write": true,
"newuser": {
"tagid": {
".validate": "root.child('users/'+newData.val()).val() === null"
}
}
}
}
但出于某些原因,我可以使用Firebase REST API使用现有的tagid添加此新用户记录。 (与邮差)
答案 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
的值时,写入被拒绝了: