2

我是Firebase的新手,因此任何提示都将不胜感激。现在我正在使用Firebase登录&身份验证来处理我的所有身份验证。但我想存储一些用户数据,比如用户名DOB,created_at ...我已经创建了一个用户节点,并且正在使用我在注册或登录时获得的唯一ID附加子节点给用户。但是我想确保系统中没有重复的用户名。如何在写入服务器之前检查用户名是否已存在?确保在Firebase中创建新用户的唯一用户名(Swift)

+0

你需要建立一个数据结构和安全规则这一点。见http://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase –

回答

3

我目前正在调查同样的事情。我的问题是我也想启用持久性,所以我需要知道可以离线访问的内容。如果您使用的持久性,我也建议禁止特定的操作,比如检查用户名是否存在,如果您的客户端离线,您可以通过听“的.info /连接”做进一步的详细位置:

https://firebase.google.com/docs/database/ios/offline-capabilities#section-connection-state

我给这家个人的工作流程如下:

  1. 登录到用户的帐户
  2. 检查用户是否已经有一个用户名

检查火力数据库,看看他们的用户信息包括用户名:

DB/users/*userUID*/username != nil 
  • 如果他们没有用户名,然后提示他们设置一个用户名。
  • 当他们设定自己的用户名,检查是否存在在用户名:

    DB/usernames/*username*/ != nil 
    

    如果它不存在,然后写在上面签两个数据库位置的用户名和用户ID。

    例如。

    user.uid = wewe32323

    用户名= scuba_steve

    DB/usernames/scuba_steve = wewe32323 
    DB/users/wewe32323/username = scuba_steve 
    

    所以,现在你有DB /用户名引用您可以快速检查,看看是否有人有一个用户名已经和你也有数据库/用户/您可以快速找到给定用户的用户名。

    我不会说这是傻瓜证明,因为我仍然关注并发请求。我正在研究的当前问题是,假设您将用户名关联删除到特定用户,用户可以依赖其数据库的本地副本错误地声明他们仍然被分配给该用户名。

    您可以查看数据库写入规则,以禁止任何人修改现有数据(强制只有在没有现有数据的情况下才能写入数据库/用户名目录。这样可以防止首先设置用户名的人重写,我认为这是重要的一步。

    这也可能是值得探讨的交易:

    https://firebase.google.com/docs/database/ios/save-data#save_data_as_transactions

    但我相信正确的写入规则段落上面提到应该允许可靠的写作。

    +0

    而且这一点,我劝存储的用户名和小写插入/小写字母检查在'DB /用户名/目录,并在'DB /用户/'目录输入的情况下,这样,“史酷比”和“史酷比”不能注册到两个不同的用户,但你仍然保留其所需资本时,您从用户信息中检索用户的用户名。 –

    +0

    我已经更有效地将它实现到了我最近的一个应用程序中,我肯定会推荐使用事务。如果您需要进一步的建议或者我的实施,请随时发表评论或与我交谈。我上面提到的大多数值和数据库检查方法仍然相关,但更适合在Transaction块内调用。 –

    +0

    我在这里详细记录在本:http://stackoverflow.com/q/37543872/5960425 –

    1

    可以检查用户名存储这样的:

    let username = "fred" 
    self.ref.child("users/\(username)").observeSingleEventOfType(.Value, withBlock: { snapshot in 
         if snapshot.exists() { 
    

    如果关闭返回快照存在,那么用户名“弗雷德”的存在。