我在我的应用中使用firebase数据库。我已经设置了允许普通用户在节点中创建新子代的规则,但是我发现它被拒绝了。
这是节点的编写规则:
".write":"auth.uid == \"DFhNb28506Y345CpJ3Ye7DQNn713\" || ((newData.exists() && !data.exists()) || auth.token.email == data.child(\"userEmail\").val())",
我认为newData.exists() && !data.exists()
应该允许用户在数据库中写入,但这没有发生
这是用户节点的规则:
"users":{
".write":"auth.uid == \"DFhNb28506Y345CpJ3Ye7DQNn713\" || ((newData.exists() && data.child(\"userEmail\").val() != null) || auth.token.email == data.child(\"userEmail\").val())",
".read": "auth != null"
}
数据库结构是这样的:
-users
-user1
-userName, userEmail ....
-user2
-userName, userEmail .....
新用户在应用中注册后,应该允许他将其数据推送到数据库中
这是数据库结构:
答案 0 :(得分:0)
好吧,我认为您正在创建不需要的额外验证步骤。
在您的".read": "auth != null"
root 上拥有users
的情况下,每个用户都可以访问其他用户的数据,因此我们应该分别解决每个用户的访问权限。
如果您只想允许经过身份验证的用户写入和读取自己的内容,则可以删除这些额外的((newData.exists() && !data.exists())
和auth.token.email == data.child(\"userEmail\").val())
步骤。
提示:此((newData.exists() && !data.exists())
比较的意思是:如果您要发送任何内容,请写在这里但是,在此请求的“路径”中应该没有任何内容。您应该考虑这一点的需要,因为我不知道您的确切用例。
此外,我想您要请求的硬编码 UID是您创建的管理员的身份-我不建议这样做,请在此{{3} }。
为澄清起见,我认为您的规则结构应如下所示:
{
"rules": {
".write":"auth.uid == \"DFhNb28506Y345CpJ3Ye7DQNn713\",
".read": "auth.uid == \"DFhNb28506Y345CpJ3Ye7DQNn713\",
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}