2016-12-29 67 views
0

我正在尝试验证用户输入的用户名是否已被占用。该代码目前检查电子邮件是否正在使用,并创建用户,如果他们不存在。我怎样才能使这个数据库读取,看看用户名是否已被使用?如果用户名已被占用,请检查Firebase数据库

FIRAuth.auth()?.createUser(withEmail: email!, password: password!) { (user, error) in 
    if error?._code == (FIRAuthErrorCode.errorCodeInvalidEmail.rawValue) 
    { 
     var ref: FIRDatabaseReference! 
     ref = FIRDatabase.database().reference() 
     ref.child("Users").observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in 

      if snapshot.hasChild(name!){ 
       ref.child("users").child((user?.uid)!).setValue(["username": name]) 
       print("true rooms exist") 
      } else { 
       self.displayMyAlertMessage(userMessage: "Username already in use. Please choose another.") 
       print("false room doesn't exist") 
      } 
     }) 
    } else { 
     self.displayMyAlertMessage(userMessage: "Email already in use. Please see the login page.") 
     return 
    } 
} 
+0

嗯,这不是“像写”你的数据库后端?你指的是'the'数据库,哪一个?你有任何代码写入永久存储? – Yohst

+0

我正在使用firebase,因此数据库已经存在。代码存储的代码是ref.child的代码。 – AlexGarlock

+0

这已被问过“几次”之前。请参阅[这些答案](http://stackoverflow.com/search?q=%5Bfirebase-database%5D%5Bios%5D+unique+username)或[来自加藤的原始答案](http://stackoverflow.com/问题/ 25294478/how-do-you-prevent-duplicate-user-properties-in-firebase)(对于JavaScript,但所有平台的逻辑都是相同的)。 –

回答

1

你可以做的事情是创造另一个孩子如“takenUsernames”,存储所有的用户名在那里。就这样,即使用户未通过身份验证,您也可以检查用户是否被带走。您还必须将规则添加到数据库中。

的数据库规则:

"takenUsernames": { 
     ".read": true, 
     ".write": "auth != null", 
     "$username": { 
     ".validate": "!root.child('takenUsernames').hasChild($username)" 
     } 
     } 

而且在斯威夫特可以做到这样的,其中用户名是从文本框的值。它基本上只是需要用户名和检查,如果这在takenUsername孩子的存在与否:

let usernamesRef = FIRDatabase.database().reference().child("takenUsernames") 
       usernamesRef.child(username).observeSingleEvent(of: .value, with: { (snapshot) in 
        if snapshot.exists() { 
         //Username is already taken 
        } else { 
         //Username doesn't exist, do your stuff 
} 

现在,每当您注册用户时,你必须添加键值对到takenUsernames孩子。在我的情况下,我这样做:

usernamesRef.updateChildValues([username:uid]) 

我希望你明白了。

+0

我认为安全规则需要更多的安全功能。使用当前的安全设置,用户可能会覆盖其他用户名,而不是他们自己的用户名。 –

+0

我明白了。几乎在两个地方存储用户名。不知道用户在检查用户名是否存在时可以覆盖其他用户名。感觉我现在就像是PlayStation,不让用户更改他们的用户名LOL – AlexGarlock

+0

如果我们想在用户首次通过身份验证之前做到这一点,该怎么办? – waseefakhtar

相关问题