在设置规则后无法在Firebase数据库中创建新子级

时间:2018-10-20 18:46:52

标签: firebase firebase-realtime-database firebase-authentication firebase-security-rules

我在我的应用中使用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 .....

新用户在应用中注册后,应该允许他将其数据推送到数据库中

这是数据库结构:

enter image description here

1 个答案:

答案 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"
      }
    }
  }
}