【问题标题】:Firebase realtime database validation username and emailFirebase 实时数据库验证用户名和电子邮件
【发布时间】:2018-02-13 19:28:55
【问题描述】:

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

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

        }
  }

root 子节点是通过邮件认证 uid 创建的,其余的将在相同的节点下。

如何防止用户输入相同的用户名和邮箱?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    如需更多解释,请阅读涉及同一主题的先前问题之一:

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2019-06-14
      相关资源
      最近更新 更多