2016-12-12 86 views
0

我嘗試阻止創建已有的用戶名。防止重複的用戶使用Firebase數據庫,Swift 3

這是我的代碼,我上傳的用戶名到數據庫:

ref?.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("username").setValue(self.createUserName.text) 

這是代碼,我試圖讓如果用戶名已經存在或不

ref?.child("users") 
    .queryOrdered(byChild: "username") 
    .queryEqual(toValue: self.createUserName.text?.uppercased()) 
    .observeSingleEvent(of: .value, with: { (snapshot) in 

     if !snapshot.exists() { 

      print("") 

     } 

    }) { error in 

     print("") 

    } 

數據庫的外觀像這樣

Database_App { 

    users { 

     -3bSRmS4PHXUwsr7XbMBwgPozNfK2 { 

      username: "sebas.varela" 

     } 

    }  

} 

並在控制檯中出現此行:

Consider adding ".indexOn": "username" at /users to your security rules for better performance 

問題是我總是得到。這有什麼問題?

+0

你有沒有考慮利用的火力地堡數據庫規則防止重複的數據?通過@Kato查看此[answer](http://stackoverflow.com/a/20291163/4625829) –

+0

爲了驗證用戶使用Firebase數據庫設置的唯一用戶名,您必須 - >獲取'ref.child(「users」)'處的整個節點,將其轉換爲 - >'let value = sanpshot.value as! [String:[String:String]]'然後迭代字典鍵,檢查嵌套字典的鍵「用戶名」的值是否等於用戶請求的用戶名。這是效率低下,請按照@FrankvanPuffelen的建議 – MikeG

+0

您可以通過幾種方法完成此操作。 1)讓Firebase通過嘗試創建用戶名來完成繁重的工作,如果Firebase正在使用,則會生成錯誤。請參見[用戶名唯一性](http://stackoverflow.com/questions/40619433/firebase-username-uniqueness-in-swift/40640229#40640229)2)將用戶信息保存在用戶名爲/子節點的/ users節點中。查詢它以確定它是否存在。請參閱[使用戶名唯一](http://stackoverflow.com/questions/35243492/firebase-android-make-username-unique)這不是迅速,但涵蓋了基本知識。 – Jay

回答

2

您只能查詢直接位於您查詢的引用下的值。對於你的情況,這將是一個數據模型,如:

Database_App { 
    users { 
     -3bSRmS4PHXUwsr7XbMBwgPozNfK2: "sebas.varela" 
    }  
} 

這會在你的代碼工作,但很難獲得安全和高性能。比較常見的做法是,你的用戶名映射到一個UID的額外節點的工作:

Database_App { 
    userNames { 
     "sebas,varela": "-3bSRmS4PHXUwsr7XbMBwgPozNfK2" 
    }  
} 

在這種情況下,節點基本上可以讓權利要求用戶他們的名字。這個系統的優點是自動保證密鑰在服務器上是唯一的,並且不需要該部分的客戶端代碼。

你會想:

  • 添加安全規則,以確保用戶只能聲稱尚未聲明還
  • 也在這些安全規則,用戶名允許用戶發佈他們的要求上用戶名
  • 添加客戶端代碼來處理衝突不是默認的一個更好的方式拒絕「權限」的錯誤,你會從服務器獲取
+0

好的,但我是Firebase的新手,我不知道如何添加您提到的規則。 –

+0

我遇到的另一個問題是,嘗試調用節點作爲用戶名並放置user_id的值會執行錯誤,因爲您不能在節點的名稱中放置點或逗號等標誌。 –

+0

您可能已經注意到,我在上面的數據中使用了逗號而不是句點,這是出於該特定原因。對值進行編碼以使它們成爲鍵是可接受的,這是此類驗證的正常部分。 –