2

Ich bin ein Neuling für Firebase, so dass jeder Hinweis geschätzt wird. Im Moment verwende ich Firebase Login & Auth, um alle Authentifizierung für mich zu behandeln. Aber ich möchte einige Benutzerdaten, wie Benutzername DOB, created_at ... Ich habe einen Benutzerknoten erstellt, und ich bin Kinderknoten an Benutzer mit der eindeutigen ID anhängen, die ich bei der Anmeldung oder Anmeldung erhalten. Ich möchte jedoch sicherstellen, dass keine doppelten Benutzernamen im System vorhanden sind. Wie kann ich überprüfen, ob ein Benutzername bereits existiert, bevor ich auf den Server schreibe?Sicherstellung eines eindeutigen Benutzernamens beim Erstellen eines neuen Benutzers in Firebase (Swift)

+0

Sie müssen dafür eine Datenstruktur und Sicherheitsregeln einrichten. Siehe http://StackOverflow.com/Questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase –

Antwort

3

Ich untersuche gerade die gleiche Sache. Mein Problem ist, dass ich auch die Persistenz aktivieren möchte, also muss ich wissen, auf was offline zugegriffen werden kann. Wenn Sie Ausdauer verwenden, würde ich auch bestimmte Operationen nicht anzuerkennen, wie die Überprüfung Benutzername Existenz empfehlen, wenn Ihr Kunde offline ist, die Sie durch das Hören tun „.info/verbunden“, wie im Einzelnen hier:

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

Meine persönlichen Workflow hierfür ist wie folgt:

  1. Anmelden Konto des Benutzers
  2. überprüfen Sie, ob der Benutzer bereits einen Benutzernamen hat

die Feuerbasis Datenbank Überprüfen Sie, ob die Benutzerdaten einen Benutzernamen enthält:

DB/users/*userUID*/username != nil 
  1. Wenn sie einen Benutzernamen nicht haben, sie dann aufgefordert, einen Benutzernamen zu setzen.

Wenn sie ihren Benutzernamen festgelegt, ob der Benutzername in vorhanden:

DB/usernames/*username*/ != nil 

Wenn es nicht existiert, dann schreiben Sie den Benutzernamen und userId in den beiden Datenbankpositionen oben geprüft.

z.

user.uid = wewe32323

username = scuba_steve

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

So, jetzt haben Sie die DB/Benutzernamen verweisen, dass Sie schnell überprüfen, um zu sehen, ob jemand einen Benutzernamen bereits hat, und auch Sie haben DB/Benutzer/wo Sie schnell einen Benutzernamen für einen bestimmten Benutzer finden können.

Ich werde nicht sagen, das ist idiotensicher, wie ich noch ein paar Bedenken um gleichzeitige Anfragen. Mein aktuelles Problem, das ich untersuche, besteht darin, dass Sie die Benutzerzuordnung zu einem bestimmten Benutzer löschen können. Der Benutzer kann sich darauf verlassen, dass seine lokale Kopie der Datenbank fälschlicherweise bestätigt, dass sie noch diesem Benutzernamen zugewiesen sind.

Sie könnten in die Schreibregeln der Datenbank schauen, um es niemandem zu erlauben, vorhandene Daten zu ändern (erzwingen, dass Sie nur in das Verzeichnis DB/Benutzernamen schreiben können, wenn keine Daten vorhanden sind.Dadurch wird verhindert, dass derjenige, der den Nutzernamen festlegt, überschrieben wird, was meiner Meinung nach ein wichtiger Schritt ist.

Es kann auch eine Untersuchung wert Transaktionen sein:

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

Aber ich richtige Schreibregeln glauben, wie im obigen Absatz erwähnt sollte zuverlässig Schreiben ermöglichen.

+0

Darüber hinaus würde ich empfehlen, den Benutzernamen in Kleinbuchstaben zu speichern und in Kleinbuchstaben einfügen/überprüfen das 'DB/usernames /' -Verzeichnis und der eingegebene Fall im 'DB/users /' -Verzeichnis, so können "Scooby" und "Scooby" nicht bei zwei verschiedenen Benutzern registriert werden, aber Sie behalten immer noch ihre gewünschte Großschreibung wenn Sie rufen den Benutzernamen eines Benutzers aus seinen Benutzerinformationen ab. –

+0

Ich habe dies effektiver in eine meiner neueren Apps implementiert, und ich würde auf jeden Fall empfehlen, Transaktionen zu verwenden. Fühlen Sie sich frei, mich zu kommentieren oder zu chatten, wenn Sie weitere Ratschläge dazu oder zu meiner Implementierung wünschen. Die meisten meiner oben erwähnten Wert- und Datenbanküberprüfungsmethoden sind jedoch immer noch relevant, nur besser geeignet, um innerhalb eines Transaktionsblocks aufzurufen. –

+0

Ich habe das hier ausführlicher dokumentiert: http://stackoverflow.com/q/37543872/5960425 –

1

können Sie überprüfen, ob der Benutzername wie folgt gespeichert wird:

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

Wenn der Snapshot in der Schließung zurück vorhanden ist, dann wird der Benutzername „fred“ existiert.

Verwandte Themen