2016-12-12 4 views
0

Ich versuche, die Erstellung von bereits vorhandenen Benutzernamen zu verhindern.Verhindern doppelte Benutzer mit Firebase Database, Swift 3

Dies ist mein Code, wo ich Benutzernamen in die Datenbank hochladen:

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

Und das ist der Code, wo ich zu bekommen versuchen, wenn der Benutzername bereits oder nicht

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

    } 

Die Datenbank sieht existiert wie diese

Database_App { 

    users { 

     -3bSRmS4PHXUwsr7XbMBwgPozNfK2 { 

      username: "sebas.varela" 

     } 

    }  

} 

Und diese Linie in der Konsole angezeigt:

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

Das Problem ist, dass ich immer bekomme. Was ist das Problem damit?

+0

Haben Sie Datenbank-Regeln Verwendung der Firebase betrachtet machen um doppelte Daten zu vermeiden? Sehen Sie dies [Antwort] (http://Stackoverflow.com/a/20291163/4625829) von @Kato –

+0

Um eindeutige Benutzernamen zu überprüfen mit der Art, wie Sie Ihre Firebase-Datenbank-Setup haben, müssen Sie -> eine Momentaufnahme der gesamter Knoten bei 'ref.child (" users ")', wirf das nach -> 'let value = sanpshot.value as! [String: [String: String]] 'und durchlaufen Sie dann die Wörterbuchschlüssel, um zu prüfen, ob der Wert für den Schlüssel' username' des verschachtelten Wörterbuchs mit dem Benutzernamen übereinstimmt, nach dem der Benutzer gefragt hat. Dies ist ineffizient, folgen Sie @FrankvanPuffelen Beratung – MikeG

+0

Sie können dies auf verschiedene Arten erreichen. 1) Lassen Sie Firebase das schwere Heben durchführen, indem Sie versuchen, den Benutzernamen zu erstellen. Wenn Firebase verwendet wird, erzeugt Firebase einen Fehler. Siehe [Benutzername-Eindeutigkeit] (http://stackoverflow.com/questions/40619433/firebase-username-uniqueness-in-swift/40640229#40640229). 2) Benutzerinformationen in einem Knoten/users mit Benutzernamen als untergeordnete Benutzer beibehalten. Frage danach, ob es existiert. Siehe [make username unique] (http://stackoverflow.com/questions/35243492/firebase-android-make-username-unique), das nicht schnell ist, aber die Grundlagen abdeckt. – Jay

Antwort

2

Sie können nur nach Werten suchen, die sich direkt unter der Referenz befinden, die Sie abfragen.

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

Dies funktioniert in Ihrem Code, aber es ist schwer, sicher und performant zu bekommen: Für Ihren Fall, der mit einem Datenmodell aussehen würde. Der häufigere Ansatz ist mit einem zusätzlichen Knoten zu arbeiten, wo Sie Benutzername uids Karte:

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

In diesem Fall wird der Knoten erlaubt im Wesentlichen ein Benutzer seinen Namen zu beanspruchen. Der Vorteil dieses Systems besteht darin, dass die Schlüssel automatisch auf dem Server eindeutig sind und kein clientseitiger Code für dieses Teil benötigt wird.

Sie wollen:

  • Sicherheitsregeln hinzufügen, die einen Benutzer sicherstellen kann nur einen Benutzernamen gekennzeichnet, die noch nicht
  • behauptet hat auch in diesen Sicherheitsregeln erlauben es einem Benutzer ihren Anspruch auf Veröffentlichung auf einen Benutzernamen
  • clientseitigen Code hinzufügen Konflikte in einem schöneren Weg als die Standard zu handhaben „Zugriff verweigert“ Fehler, den Sie vom Server bekommen
+0

Ok, aber ich bin neu in Firebase und ich weiß nicht, wie man die Regeln hinzufügt, die du erwähnst. –

+0

Ein anderes Problem, das ich habe, ist, dass versucht, den Knoten als den Benutzernamen zu nennen und den Wert der user_id einen Fehler ausführt, da Sie Zeichen wie Punkte oder Kommas im Namen des Knotens nicht platzieren können. –

+0

Sie haben vielleicht bemerkt, dass ich aus diesem Grund ein Komma anstelle des Zeitraums in meinen Daten oben verwende. Codieren von Werten, um sie als Schlüssel akzeptabel zu machen, ist ein normaler Teil dieser Art von Validierung. –