【问题标题】:Ensuring unique username on creating a new user in Firebase (Swift) [duplicate]确保在 Firebase (Swift) 中创建新用户时用户名唯一 [重复]
【发布时间】:2016-09-27 02:57:03
【问题描述】:

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

【问题讨论】:

标签: ios swift firebase firebase-realtime-database firebase-authentication


【解决方案1】:

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

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

如果闭包中返回的快照存在,则用户名“fred”存在。

【讨论】:

    【解决方案2】:

    我目前正在调查同样的事情。我的问题是我还希望启用持久性,因此我需要了解可以离线访问的内容。如果您正在使用持久性,我还建议您禁止特定操作,例如在您的客户端离线时检查用户名是否存在,您可以通过收听“.info/connected”来执行此操作,如下所述:

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

    我个人的工作流程如下:

    1. 登录用户帐户
    2. 检查用户是否已有用户名

    检查 firebase 数据库以查看他们的用户详细信息是否包含用户名:

    DB/users/*userUID*/username != nil
    
    1. 如果他们没有用户名,则提示他们设置用户名。

    当他们设置用户名时,检查用户名是否存在于:

    DB/usernames/*username*/ != nil
    

    如果不存在,则在上面选中的两个数据库位置写入用户名和userId。

    例如。

    user.uid = wewe32323

    用户名 = scuba_steve

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

    因此,现在您有了 DB/usernames 参考,您可以快速检查以查看是否有人已经拥有用户名,并且您还拥有 DB/users/,您可以在其中快速找到给定用户的用户名。

    我不会说这是万无一失的,因为我对并发请求仍有一些顾虑。我正在调查的当前问题是,假设您删除了与特定用户的用户名关联,用户可以依靠他们的本地数据库副本错误地断言他们仍然被分配给该用户名。

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

    或许也值得研究一下交易:

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

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

    【讨论】:

    • 此外,我建议将用户名存储为小写,并在 DB/usernames/ 目录中插入/检查小写,并在 DB/users/ 目录中输入大小写,这样“Scooby”和“scooby”不能注册给两个不同的用户,但是当您从用户信息中检索用户的用户名时,您仍然保留他们所需的大小写。
    • 我已经在我最近的一个应用程序中更有效地实现了这一点,我肯定会推荐使用 Transactions。如果您想对此或我的实施有进一步的建议,请随时发表评论或与我聊天。我上面提到的大多数值和数据库检查方法仍然相关,只是更适合在事务块中调用。
    • 我在这里更详细地记录了这一点:stackoverflow.com/q/37543872/5960425
    猜你喜欢
    • 1970-01-01
    • 2017-03-29
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多