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() { 
    

    如果關閉返回快照存在,那麼用戶名「弗雷德」的存在。