Firebase实时数据库验证用户名和电子邮件

时间:2017-09-05 13:19:22

标签: android firebase-realtime-database firebase-security

最近发现数据库规则可以设置为验证数据库是否已经拥有相同的数据,但目前它只接受相同的数据插入,但如何验证和阻止用户名和电子邮件的相同输入?

{
"rules": {
        ".read": true,
    ".write": true,
        "username":{
       ".validate": "!root.child('username').child(newData.val()).exists()"
        },
        "email":{
        ".validate": "!root.child('email').child(newData.val()).exists()"
      }

        }
  }

根子项由电子邮件身份验证uid创建,其余的将在相同的节点下。

enter image description here

如何阻止用户输入相同的用户名和电子邮件?

1 个答案:

答案 0 :(得分:1)

您的规则验证单个属性/username是否存在,并且与您正在编写的新数据具有相同的值。您的用例似乎有所不同:您希望确保所有用户都有唯一的用户名。

在Firebase的安全规则中,您无法确保多个节点之间的唯一值。相反,您需要将用户名作为键存储在单独的集合中,即

usernames
  "rexyou0831": "ik3sf...."

上述数据结构表明用户ik3sf...声称名称为rexyou0831。有了这样的结构,用户名就保证是唯一的,因为根据定义,键必须在集合中是唯一的。您可以确保用户只能使用以下命令编写新名称或删除自己的名称:

{
  "rules": {
    "usernames": {
      "$name": {
        ".write": "!data.exists() || newData.val() === data.val()"
      }
    }
  }
}

为了强制执行电子邮件地址的唯一性,您还需要为这些地址创建类似的集合。

如需更多解释,请阅读以下涵盖同一主题的问题之一: