Ich habe kürzlich ein Tutorial über Thinkster zum Erstellen einer Web-App mit Angular und Firebase verfolgt .
Das Tutorial verwendet die Firebase simpleLogin-Methode, mit der ein 'Profil' erstellt werden kann, das einen Benutzernamen enthält.
Fabrik:
%Vor%Controller:
%Vor%Ganz am Ende des Tutorials gibt es einen Abschnitt "nächste Schritte", der Folgendes enthält:
Erzwingen Sie die Eindeutigkeit des Benutzernamens - diese ist knifflig, überprüfen Sie die Firebase-Prioritäten und sehen Sie, ob Sie sie verwenden können, um Benutzerprofile nach Benutzername abzufragen
Ich habe gesucht und gesucht, kann aber keine klare Erklärung dafür finden, insbesondere was die setPriority () Funktion von Firebase
Ich bin ziemlich der Firebase-Neuling, also würde jede Hilfe hier dankbar empfangen werden.
Es gibt ein paar ähnliche Fragen , aber ich kann mich nicht darum kümmern, wie ich das klären kann.
Enormer Dank im Voraus.
BEARBEITEN
Aus Mareins Antwort habe ich die Registerfunktion in meinem Controller auf:
aktualisiert %Vor% Aber es wirft einen 'undefined ist keine Funktion' Fehler in der Zeile var q = ref.child('profile').orderByChild('username').equalTo($scope.user.username);
. Ich habe den Code nachher auskommentiert und nur console.log (q) versucht aber trotzdem keine Freude.
BEARBEITEN 2
Das Problem mit dem oben genannten war, dass das Thinkster-Tutorial Firebase 0.8 verwendet und orderByChild nur in späteren Versionen verfügbar ist. Aktualisiert und Mareins Antwort ist perfekt.
Hier gibt es zwei Dinge zu tun, eine clientseitige Prüfung und eine serverseitige Regel.
Auf der Client-Seite möchten Sie überprüfen, ob der Benutzername bereits existiert, so dass Sie dem Benutzer mitteilen können, dass seine Eingabe ungültig ist, bevor Sie ihn an den Server senden. Wo genau Sie dies implementieren, aber der Code würde etwa so aussehen:
%Vor%Sie können dies vor dem Schreiben auf den Server überprüfen. Was ist jedoch, wenn ein Benutzer böswillig ist und beschließt, die JS-Konsole zu verwenden, um trotzdem auf den Server zu schreiben? Um dies zu verhindern, benötigen Sie serverseitige Sicherheit.
Ich habe versucht, eine Beispiellösung zu finden, aber ich stieß auf ein Problem. Hoffentlich wird jemand erfahrener mitkommen. Mein Problem ist wie folgt. Angenommen, Ihre Datenbankstruktur sieht so aus:
%Vor% Wenn Sie ein neues Profil hinzufügen, möchten Sie eine Regel, die sicherstellt, dass kein Profilobjekt mit der gleichen Eigenschaft username
existiert. Soweit ich weiß, unterstützt die Firebase-Sicherheitssprache dies jedoch nicht mit dieser Datenstruktur.
Eine Lösung wäre, die Datenstruktur so zu ändern, dass username
als Schlüssel für jedes Profil verwendet wird (anstelle von profile1
, profile2
, ...). So kann es immer nur ein Objekt mit diesem Benutzernamen geben. Datenbankstruktur wäre:
Dies könnte in diesem Fall eine praktikable Lösung sein. Was aber, wenn nicht nur der Benutzername, sondern beispielsweise auch die E-Mail eindeutig sein muss? Sie können nicht beide der Objektschlüssel sein (außer wir verwenden String-Verkettungen ...).
Eine weitere Sache, die Ihnen in den Sinn kommt, besteht darin, zusätzlich zu der Liste der Profile eine separate Liste von Benutzernamen und eine separate Liste von E-Mails zu führen. Diese können dann leicht in Sicherheitsregeln verwendet werden, um zu überprüfen, ob der angegebene Benutzername und die E-Mail bereits vorhanden sind. Die Regeln würden etwa so aussehen:
%Vor%Aber jetzt stoßen wir auf ein anderes Problem; Wie kann sichergestellt werden, dass bei der Erstellung eines neuen Profils der Benutzername (und die E-Mail-Adresse) ebenfalls in diese neuen Listen aufgenommen wird? [1]
Dies kann wiederum gelöst werden, indem der Profilerstellungscode aus dem Client genommen und stattdessen auf einem Server abgelegt wird. Der Client müsste dann den Server bitten, ein neues Profil zu erstellen, und der Server würde sicherstellen, dass alle notwendigen Aufgaben ausgeführt werden.
Wie es scheint, sind wir jedoch sehr weit unten in ein Loch gegangen, um diese Frage zu beantworten. Vielleicht habe ich etwas übersehen und die Dinge sind einfacher als sie scheinen. Irgendwelche Gedanken werden geschätzt.
Ich entschuldige mich auch, wenn diese Antwort eher eine Frage als eine Antwort ist, ich bin neu in SO und bin mir noch nicht sicher, was als Antwort angemessen ist.
[1] Obwohl Sie vielleicht argumentieren könnten, dass dies nicht sichergestellt werden muss, da ein böswilliger Benutzer sich nur selbst Schaden zufügen würde, indem er nicht seine einzigartige Identität beansprucht?
Ich hatte ein ähnliches Problem. Aber es war nach der Registrierung des Benutzers mit Passwort und E-Mail. Im Benutzerprofil könnte ein Benutzername gespeichert werden, der eindeutig sein muss und ich eine Lösung gefunden habe, vielleicht kann diese Ihnen dienen.
%Vor%Tags und Links angularjs firebase angularfire