在 Firebase 中创建新用户时确保用户名唯一 (Swift)
Ensuring unique username on creating a new user in Firebase (Swift)
我是 Firebase 的新手,所以任何提示都将不胜感激。现在我正在使用 Firebase Login & Auth 为我处理所有身份验证。但是我想存储一些用户数据,比如用户名 DOB,created_at...但是我想确保系统中没有重复的用户名。如何在写入服务器之前检查用户名是否已经存在?
您可以检查用户名是否存储如下:
let username = "fred"
self.ref.child("users/\(username)").observeSingleEventOfType(.Value, withBlock: { snapshot in
if snapshot.exists() {
如果闭包中返回的快照存在,则用户名"fred"存在。
我目前正在调查同样的事情。我的问题是我还想启用持久性,所以我需要知道可以离线访问的内容。如果您使用的是持久性,我还建议您禁止特定操作,例如在您的客户端离线时检查用户名是否存在,您可以通过收听“.info/connected”来实现,详情如下:
https://firebase.google.com/docs/database/ios/offline-capabilities#section-connection-state
我个人的工作流程如下:
- 登录用户帐户
- 检查用户是否已有用户名
检查 firebase 数据库以查看他们的用户详细信息是否包含用户名:
DB/users/*userUID*/username != nil
- 如果他们没有用户名,则提示他们设置用户名。
当他们设置用户名时,检查用户名是否存在于:
DB/usernames/*username*/ != nil
如果不存在,则在上面勾选的两个数据库位置写入username和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
但我相信上面段落中提到的正确书写规则应该可以实现可靠的书写。
我是 Firebase 的新手,所以任何提示都将不胜感激。现在我正在使用 Firebase Login & Auth 为我处理所有身份验证。但是我想存储一些用户数据,比如用户名 DOB,created_at...但是我想确保系统中没有重复的用户名。如何在写入服务器之前检查用户名是否已经存在?
您可以检查用户名是否存储如下:
let username = "fred"
self.ref.child("users/\(username)").observeSingleEventOfType(.Value, withBlock: { snapshot in
if snapshot.exists() {
如果闭包中返回的快照存在,则用户名"fred"存在。
我目前正在调查同样的事情。我的问题是我还想启用持久性,所以我需要知道可以离线访问的内容。如果您使用的是持久性,我还建议您禁止特定操作,例如在您的客户端离线时检查用户名是否存在,您可以通过收听“.info/connected”来实现,详情如下:
https://firebase.google.com/docs/database/ios/offline-capabilities#section-connection-state
我个人的工作流程如下:
- 登录用户帐户
- 检查用户是否已有用户名
检查 firebase 数据库以查看他们的用户详细信息是否包含用户名:
DB/users/*userUID*/username != nil
- 如果他们没有用户名,则提示他们设置用户名。
当他们设置用户名时,检查用户名是否存在于:
DB/usernames/*username*/ != nil
如果不存在,则在上面勾选的两个数据库位置写入username和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
但我相信上面段落中提到的正确书写规则应该可以实现可靠的书写。