Firebase-Sicherheitsregeln

In Firebase Realtime Database-Sicherheitsregeln schützen Sie Ihre Daten vor nicht autorisierten Benutzern und schützen Ihre Datenstruktur.  

In diesem Kurztipp-Tutorial erkläre ich, wie Sie Ihre Datenbanksicherheitsregeln richtig konfigurieren, sodass nur autorisierte Benutzer Lese- oder Schreibzugriff auf Daten haben. Ich zeige Ihnen auch, wie Sie Ihre Daten so strukturieren können, dass sie leicht zu sichern sind.

Das Problem

Nehmen wir an, wir haben JSON-Daten in unserer Firebase-Datenbank, wie im folgenden Beispiel:

"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": "89" "phoneNumber": "07012345678", "user2": "firstName ":" Godswill "," lastName ":" Okwara "," age ":" 12 "" phoneNumber ":" 0701234 "," user3 ": " firstName ":" Onu "," lastName ": 543," Alter ": 90" Telefonnummer ":" 07012345678 ",…

Wenn Sie sich die Datenbank ansehen, können Sie feststellen, dass unsere Daten einige Probleme haben:

  1. Zwei Benutzer (user1 und user3) haben die gleichen Telefonnummern. Wir möchten, dass diese einzigartig sind.
  2. user3 hat eine Zahl für den Nachnamen anstelle einer Zeichenfolge.
  3. user2 hat nur sieben Ziffern anstatt 11. 
  4. Der Alterswert für user1 und user2 ist eine Zeichenfolge, während die von user3 ist eine Zahl.

Mit all diesen Mängeln in unseren Daten haben wir die Datenintegrität verloren. In den folgenden Schritten zeige ich Ihnen, wie Sie diese verhindern können. 

Erlaubnisregeln

Die Firebase-Echtzeitdatenbank verfügt über die folgenden Regeltypen:

Art Funktion
.lesen Beschreibt, ob und wann Daten von Benutzern gelesen werden dürfen.
.schreiben Beschreiben Sie, ob und wann Daten geschrieben werden dürfen.
.bestätigen Legt fest, wie ein korrekt formatierter Wert aussehen wird, ob er untergeordnete Attribute hat und welchen Datentyp er hat.
.indexOn Gibt ein zu indizierendes Kind an, um das Sortieren und Abfragen zu unterstützen.

Weitere Informationen dazu finden Sie in den Firebase-Dokumenten.

Hier ist eine sehr freizügige Regel für die Benutzer Schlüssel in unserer Datenbank. 

"rules": "users": // Benutzer sind für jeden lesbar ".read": true, // Benutzer sind für jeden schreibbar ".write": true

Dies ist schlecht, da jeder Benutzer Daten in die Datenbank lesen oder schreiben kann. Jeder kann auf den Pfad zugreifen / Benutzer / sowie tiefere Wege. Nicht nur das, aber es gibt keine Struktur für die Daten der Benutzer.

Zugriffssteuerungsregeln

"rules": "users": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", 

Mit diesen Regeln steuern wir den Zugriff auf die Benutzerdatensätze für angemeldete Benutzer. Darüber hinaus können Benutzer nur ihre eigenen Daten lesen oder schreiben. Wir machen das mit einem Platzhalter: $ uid. Dies ist eine Variable, die den untergeordneten Schlüssel darstellt (Variablennamen beginnen mit $). Zum Beispiel Zugriff auf den Pfad / Benutzer / Benutzer1, $ uid ist "user1"

Als nächstes nutzen wir die Auth Variable, die den aktuell authentifizierten Benutzer darstellt. Dies ist eine vordefinierte Servervariable, die von Firebase bereitgestellt wird. In den Zeilen 5 und 6 erzwingen wir eine Einschränkung der Zugänglichkeit, dass nur der authentifizierte Benutzer mit derselben ID wie der Benutzerdatensatz seine Daten lesen oder schreiben kann. Mit anderen Worten, für jeden Benutzer wird Lese- und Schreibzugriff gewährt / Benutzer //, woher steht für die aktuell authentifizierte Benutzer-ID.

Andere Firebase-Servervariablen sind:  

jetzt Die aktuelle Zeit in Millisekunden seit der Linux-Epoche.
Wurzel EIN RuleDataSnapshot Darstellen des Stammpfads in der Firebase-Datenbank, wie er vor dem versuchten Vorgang vorhanden ist. 
neue Daten EIN RuleDataSnapshot Darstellung der Daten so, wie sie nach der versuchten Operation existieren würden. Es beinhaltet die neuen Daten, die geschrieben werden, und vorhandene Daten. 
Daten Ein RuleDataSnapshot, der die Daten darstellt, die vor dem versuchten Vorgang vorhanden waren.
Auth Stellt die Token-Nutzlast eines authentifizierten Benutzers dar.

Weitere Informationen zu diesen und anderen Servervariablen finden Sie in den Firebase-Dokumenten.

Erzwingen der Datenstruktur

Wir können auch Firebase-Regeln verwenden, um Einschränkungen für die Daten in unserer Datenbank durchzusetzen. 

In den folgenden Regeln in den Zeilen 8 und 11 stellen wir zum Beispiel sicher, dass alle neuen Werte für den Vornamen und Nachnamen eine Zeichenfolge sein müssen. In Zeile 14 stellen wir sicher, dass das Alter eine Zahl ist. In den Zeilen 17 und 18 setzen wir schließlich ein, dass der Wert der Telefonnummer eine Zeichenfolge sein muss und die Länge 11 haben muss.

"rules": "users": "$ uid": ".read": "auth.uid == $ uid", ".write": "auth.uid == $ uid", "firstName" : ".validate": "newData.isString ()", "lastName": ".validate": "newData.isString ()", "age": ".validate": "newData.isNumber ( ) "," phoneNumber ": " .validate ":" newData.isString () && newData.val (). length == 11 ",

Aber wie vermeiden wir doppelte Telefonnummern??

Duplikate vermeiden

Als Nächstes zeige ich Ihnen, wie Sie doppelte Telefonnummern vermeiden.

Schritt 1: Normalisieren Sie die Datenstruktur

Als erstes müssen wir den Stammpfad so ändern, dass er eine Top-Ebene enthält /Telefonnummern/ Knoten. Wenn Sie einen neuen Benutzer erstellen, fügen wir diesem Knoten auch die Telefonnummer des Benutzers hinzu, wenn die Validierung erfolgreich ist. Unsere neue Datenstruktur sieht wie folgt aus:

"users": "user1": "firstName": "Chike", "lastName": "Mgbemena", "age": 89, "phoneNumber": "07012345678", "user2": "firstName" : "Godswill", "lastName": "Okwara", "age": 12, "phoneNumber": "06034345453", "user3": "firstName": "Onu", "lastName": "Emeka", " Alter ": 90," Telefonnummer ":" 09034564543 ", ...," Telefonnummer ": " 07012345678 ":" Benutzer1 "," 06034345453 ":" Benutzer2 "," 09034564543 ":" Benutzer3 ",… 

Schritt 2: Neue Datenstruktur erzwingen

Wir müssen die Sicherheitsregeln ändern, um die Datenstruktur durchzusetzen: 

"rules": "users": "$ uid": … "phoneNumber": ".validate": "newData.isString () && newData.val (). length == 11 &&! root.child ('phoneNumbers'). child (newData.val ()). exists () ",

Hier stellen wir sicher, dass die Telefonnummer eindeutig ist, indem wir prüfen, ob sie bereits ein Kind des ist /Telefonnummern/ Knoten mit der angegebenen Telefonnummer als Schlüssel. Wir prüfen also, dass die Telefonnummer von einem Benutzer noch nicht registriert wurde. Wenn dies nicht der Fall ist, ist die Validierung erfolgreich und die Schreiboperation wird akzeptiert. Andernfalls wird sie abgelehnt. 

Ihre App muss die Telefonnummer zur Liste der Telefonnummern hinzufügen, wenn Sie einen neuen Benutzer erstellen. Außerdem muss die Telefonnummer eines Benutzers gelöscht werden, wenn dieser Benutzer gelöscht wird.

Validierung und Sicherheitsregeln simulieren

Sie können Ihre Sicherheitsregeln in der Firebase-Konsole simulieren, indem Sie auf klicken Simulator Taste. Fügen Sie Ihre Sicherheitsregeln hinzu, wählen Sie den Simulationstyp aus (entweder lesen oder schreiben), geben Sie einige Daten mit einem Pfad ein und klicken Sie auf Lauf Taste: 

Wenn der Wert des Vornamens eine Zahl anstelle einer Zeichenfolge ist, schlägt die Überprüfung fehl und der Schreibzugriff wird verweigert:

Fazit

In diesem Kurztipp haben Sie die Sicherheitsregeln von Firebase Database kennengelernt: So können Sie den unberechtigten Zugriff auf Daten verhindern und sicherstellen, dass die Daten in der Datenbank strukturiert sind.

Weitere Informationen zu den Sicherheitsregeln von Firebase Database finden Sie in der offiziellen Dokumentation. Auf Envato Tuts finden Sie einige unserer anderen Firebase-Tutorials und -Kurse+!