2016-08-07 28 views
0

Ich bin neu in Firebase. Ich habe eine Firebase-Echtzeit-Datenbank eingerichtet und kann lesen und schreiben, wenn die Lese- und Schreibregeln auf wahr gesetzt sind.Firebase-Datenbank-Authentifizierung mit E-Mail und Passwort

Ich habe ein Problem mit der Authentifizierung.Ich habe die Authentifizierung für Google und E-Mail plus Passwort eingerichtet.

Mein Ziel ist es, jedem Benutzer zu erlauben, die Daten zu lesen, aber nur ein Benutzer (ich selbst) kann Daten nach dem Einloggen mit einer einzigen E-Mail-Adresse und einem Passwort schreiben.

i aus und schreiben in die Datenbank erfolgreich lesen, wenn ich mit Google anmelden (mit Regeln auf: Auth = null).

i kann aus auch gelesen und in die Datenbank die gleichen Regeln schreiben unter Verwendung von (auth! = null) wenn ich mich mit der Email Adresse und dem Passwort anmelde.

Ich weiß nicht, wie ich es einrichten soll, nur Schreibzugriff für den einzelnen Benutzer zu erlauben, der sich mit einer E-Mail-Adresse und einem Kennwort anmeldet.

Ich habe versucht, einen Benutzerknoten in die Regeln aufzunehmen, aber ich kann nicht zugreifen, wenn ich den Simulator benutze (siehe unten) und ich weiß nicht, wie ich die UID (die ich nach dem Einloggen bekomme) einbinden kann Referenzgebäude - das ist die Referenz i zur Zeit verwenden (die mit der Lese arbeitet und Regeln auf true gesetzt schreiben):

DatabaseReference databaseReference = mRootReference.child("Action_helper/1/Action_table_of_contents"); 

i keinen Benutzer Knoten in der Datenbank enthalten sind, wie ich gehe davon aus, dass gesorgt wird von Firebase-Authentifizierung.

hier ist das Layout meiner Daten:

enter image description here

ich den Simulator versucht haben Optionen verschiedene Regeln. diese Einstellungen im Simulator (Auswahl der benutzerdefinierten Provider-Option) Testen Zugang:

Auth { "Anbieter": "Feuerbasis", "uid": "Rp3OgoaABMN3hqTv0aF29ECQRCQ2"}

Anmerkung: i erhalten die Anbieter und uid aus Firebase-Objekt, nachdem er mit einer E-Mail-Adresse anmelden und das Passwort, die ich in Firebase-Authentifizierung eingerichtet haben:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    if (user != null) { 
     // User is signed in 
     userId = user.getUid(); 
     String provider = user.getProviderId(); 

enter image description here

enter image description here

ich würde mich freuen, wenn ich 1) meine Regeln formulieren würde, 2) ob und wie ich meine Datenstruktur ändern sollte, und 3) schließlich die UID in die Datenbankreferenz aufnehmen, mit der ich Daten in die Datenbank schreiben werde Datenbank.

dank

Antwort

1

Es gibt keine Nutzer-Knoten so, würde nicht helfen, in Regeln zu definieren. Ich denke, die Regel, die so etwas wie unten wäre arbeiten kann (vorausgesetzt, 0 und 1 sind uid):

{ 
     "rules": { 

     "Action_helper":{ 

      "$uid":{ 

       //user-based security 
       ".read": "auth != null && $uid === auth.uid", 
       ".write": "auth != null", 

      }//$uid 

     }//Action_helper 

    }// rules 
} 

Prüfungs oben genannten Regeln standardmäßig, wenn wir es nicht Regeln definieren, dann ist falsch, dh bei Action_helper ist es falsch für beide lesen und schreiben.Wenn es um den Knoten uid geht (wobei $ Wildcard bezeichnet) dann überprüfen wir, ob die Benutzer-ID des angemeldeten Benutzers identisch mit uid dieses Knotens ist und Regeln entsprechend definieren.

I empfehlen über den Link The key to Firebase security - Google I/O 2016, zu gehen ist es sehr hilfreich, einfach zu folgen, und beste Erklärung fand ich bisher mit Demo-Beispiel.

Das Datenlayout hängt von Ihren Anforderungen und Bildschirmen ab. Obwohl Firebase 32 Verschachtelungsebenen zulässt, wird dringend empfohlen, Knoten so wenig wie möglich zu verschachteln. Und eine andere wichtige Sache, über das Datenlayout nachzudenken, ist es, die Daten möglichst denormalisieren zu lassen, auch wenn wir Kopien von Feldern über die Knoten machen müssen.

Um uid in Datenbankreferenz sind Sie auf Anfügen jedes Kind halten können:

DatabaseReference databaseReference = mRootReference.child("Action_helper).child(uid).child("Action_table_of_contents"); 

So, hier sind wir von Wurzelknoten Kind „Action_helper“ und geht weiter nach unten, es ist Kind beziehen, die uid übereinstimmt und von dieser Uid verweisen wir auf das Kind "Action_table_of_contents".

0

danke für die Hilfe. Ich habe es geschafft (teilweise) funktioniert, aber bin mir nicht sicher, ob ich es richtig mache. hier ist meine Datenstruktur (i die Namen geändert haben) - es gibt einen Benutzerknoten (die Authentifizierung uid verwendet wird), und zwei untergeordnete Knoten, die die Daten enthalten:

enter image description here

und hier sind meine Regeln:

enter image description here

im wesentlichen funktioniert es im Simulator aber in Code, ich bin in der Lage anmelden und lesen und schreiben. ABER ich habe jetzt ein Problem, wenn ich mich nicht anmelde, dann ist die in der Query referenzierte uid null, wenn ich einen Dummy-Wert als die uid gebe, kann ich überhaupt nicht auf die Daten zugreifen (wie die Daten darunter sind) Benutzer/the_valid_uid-Knoten und die Dummy-UID stimmt nicht mit der_valid_uid überein.

also wie baue ich eine Datenbankreferenz ohne hart Codierung der gültigen User-UID? damit ich auf die Daten in den Knoten Addiction_items und table_of_contents_items zugreifen kann (mein Ziel ist es, jedem die Möglichkeit zu geben, Daten in beiden Knoten zu lesen, aber nur einem Benutzer erlaubt, auf beide Knoten zu schreiben, nachdem er sich mit meiner E-Mail-Adresse angemeldet hat ? und Passwort

dank

+0

Versuchen sie bewegen „.mehr‚:‘true“, nach oben Knoten dh legen sie es direkt unter ‚Regeln‘. Knoten Dies ermöglicht es jedermann von Wurzelknoten bis alle anderen untergeordneten Knoten lesen Es wird keine Authentifizierung benötigt, um zu lesen. – 0p3n5ourcE

+0

Und um es zu testen, können Sie im Simulator mit Authenticated versuchen und versuchen, von jedem Knoten zu lesen. – 0p3n5ourcE

+0

danke @openSource für Ihre Hilfe und den Link zu der Firebase Youtube Empfehlung. Ich fand es nützlich, ich habe es endlich wie geplant funktioniert. $ uid === 'Meine E-Mail-Login-ID' in den Regeln zum Schreiben, so dass nur dieser E-Mail-Login in den Benutzerordner schreiben kann (sonst könnte jeder Login-Benutzer dort schreiben). –