API für Firebase-Datenbanksicherheitsregeln

Regel: Typen

.lesen

Gewährt einem Client Lesezugriff auf den Speicherort einer Firebase-Echtzeitdatenbank.

Eine .read Regel ist eine Art Sicherheitsregel, die einem Client Lesezugriff auf den Speicherort einer Firebase-Echtzeitdatenbank gewährt. Zum Beispiel:

 ".read": "auth != null && auth.provider == 'twitter'"

Der Wert einer .read Regel ist eine Zeichenfolge, die als Teilmenge der JavaScript-Ausdruckssyntax mit einigen Verhaltensänderungen zur Erhöhung der Klarheit und Korrektheit ausgewertet wird. Eine .read Regel, die die Berechtigung zum Lesen eines Standorts erteilt, ermöglicht auch das Lesen aller Nachkommen dieses Standorts, selbst wenn die Nachkommen ihre eigenen .read Regeln haben, die fehlschlagen.

Eine .read Regel hat Zugriff auf alle Regelvariablen der Firebase Realtime Database mit Ausnahme von newData .

.schreiben

Gewährt einem Client Schreibzugriff auf den Speicherort einer Firebase-Echtzeitdatenbank.

Eine .write Regel ist eine Art Sicherheitsregel, die einem Client Schreibzugriff auf den Speicherort einer Firebase-Echtzeitdatenbank gewährt. Zum Beispiel:

".write": "auth != null && auth.token.isAdmin == true"

Der Wert einer .write Regel ist eine Zeichenfolge, die als Teilmenge der JavaScript-Ausdruckssyntax mit einigen Verhaltensänderungen zur Erhöhung der Klarheit und Korrektheit ausgewertet wird. Eine .write Regel, die die Berechtigung zum Schreiben an einen Speicherort erteilt, ermöglicht auch das Schreiben an alle Nachkommen dieses Speicherorts, selbst wenn die Nachkommen ihre eigenen .write Regeln haben, die fehlschlagen.

Eine .write Regel hat Zugriff auf alle Regelvariablen der Firebase Realtime Database.

.bestätigen

Wird verwendet, sobald eine .write Regel Zugriff gewährt hat, um sicherzustellen, dass die zu schreibenden Daten einem bestimmten Schema entsprechen.

Eine .validate Regel wird verwendet, sobald eine .write Regel Zugriff gewährt hat, um sicherzustellen, dass die zu schreibenden Daten einem bestimmten Standard entsprechen. Zusätzlich zu einem .write das Zugriff gewährt, müssen alle relevanten .validate Regeln erfolgreich sein, bevor ein Schreibzugriff zulässig ist. Zum Beispiel:

".validate": "newData.hasChildren(['name', 'age'])"

Der Wert einer .validate -Regel ist eine Zeichenfolge, die als Teilmenge der JavaScript-Ausdruckssyntax mit einigen Verhaltensänderungen zur Erhöhung der Klarheit und Korrektheit ausgewertet wird.

Eine .validate Regel hat Zugriff auf alle Regelvariablen der Firebase Realtime Database.

.indexOn

Verbessert die Abfrageleistung, indem der Firebase-Echtzeitdatenbank mitgeteilt wird, welche Schlüssel Ihre Daten indiziert werden sollen.

Die .indexOn Regel weist die Firebase-Echtzeitdatenbankserver an, bestimmte Schlüssel in Ihren Daten zu indizieren, um die Leistung Ihrer Abfragen zu verbessern. Wenn wir beispielsweise eine Datenbank mit einer Sammlung von Dinosaurierdaten haben, können wir Firebase Realtime Database anweisen, Abfragen zu optimieren, bevor sie von den Servern zurückgegeben werden, indem wir diese Regel hinzufügen:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Weitere Informationen zur .indexOn Regel finden Sie im Abschnitt des Sicherheitsleitfadens zur Indizierung Ihrer Daten .

Regel: Variablen

Autor

Eine Variable, die die Token-Nutzlast enthält, wenn ein Client authentifiziert ist, oder null , wenn der Client nicht authentifiziert ist.

Mit der Firebase Realtime Database können Sie sich problemlos bei mehreren integrierten Anbietern authentifizieren und Authentifizierungstoken für diese generieren. Nachdem ein Benutzer bei einem der integrierten Anbieter authentifiziert wurde, enthält die Authentifizierungsvariable Folgendes:

Feld Beschreibung
provider Die verwendete Authentifizierungsmethode (z. B. „Passwort“, „Anonym“, „Facebook“, „Github“, „Google“ oder „Twitter“).
uid Eine eindeutige Benutzer-ID, die garantiert bei allen Anbietern eindeutig ist.
token Der Inhalt des Firebase-Auth-ID-Tokens. Siehe auth.token .

Als Beispiel könnten wir eine Regel wie die folgende haben, um Benutzern das Erstellen von Kommentaren zu ermöglichen, solange sie ihre Benutzer-ID mit dem Kommentar speichern:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
    }
  }
}

Wir könnten auch eine Regel wie die folgende erstellen, um Benutzern das Erstellen von Kommentaren zu ermöglichen, solange sie bei Facebook angemeldet sind:

{
  "rules": {
    ".read": true,
    "$comment": {
      ".write": "!data.exists() && auth.provider == 'facebook'"
    }
  }
}

Authentifizierungstoken

Eine Variable, die den Inhalt des Firebase-Auth-ID-Tokens enthält.

Der Token enthält einige oder alle der folgenden Schlüssel:

Feld Beschreibung
email Die mit dem Konto verknüpfte E-Mail-Adresse, falls vorhanden.
email_verified true , wenn der Benutzer bestätigt hat, dass er Zugriff auf die email Adresse hat. Einige Anbieter verifizieren automatisch ihre E-Mail-Adressen.
phone_number Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden.
name Der Anzeigename des Benutzers, falls festgelegt.
sub Die Firebase-UID des Benutzers. Dies ist innerhalb eines Projekts einzigartig.
firebase.identities Wörterbuch aller Identitäten, die mit dem Konto dieses Benutzers verknüpft sind. Die Schlüssel des Wörterbuchs können folgende sein: email , phone , google.com , facebook.com , github.com , twitter.com . Die Werte des Wörterbuchs sind Arrays eindeutiger Kennungen für jeden mit dem Konto verknüpften Identitätsanbieter. Beispielsweise enthält auth.token.firebase.identities["google.com"][0] die erste Google-Benutzer-ID, die mit dem Konto verknüpft ist.
firebase.sign_in_provider Der Anmeldeanbieter, der zum Erhalten dieses Tokens verwendet wurde. Kann eine der folgenden Zeichenfolgen sein: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com .
firebase.tenant Die mit dem Konto verknüpfte Mieter-ID, falls vorhanden. z. tenant2-m6tyz

Bei Verwendung einer benutzerdefinierten Authentifizierung enthält auth.token auch alle vom Entwickler angegebenen benutzerdefinierten Ansprüche.

Alle diese Werte können innerhalb von Regeln verwendet werden. Um beispielsweise den Zugriff auf Google-Konten einzuschränken, die mit einer gmail.com-Adresse verknüpft sind, könnten wir die Regel hinzufügen:

{
  "rules": {
    ".read": "auth != null",
    "gmailUsers": {
      "$uid": {
        ".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
      }
    }
  }
}

Der Vollständigkeit halber sind die folgenden Felder auch in auth.token enthalten, sie sind jedoch wahrscheinlich nicht für Regeln nützlich.

Feld Beschreibung
iss Der Emittent des Tokens.
aud Das Publikum für das Token.
auth_time Das letzte Mal, dass sich der Benutzer mit einem Berechtigungsnachweis über das Gerät authentifiziert hat, das das Token empfangen hat.
iat Der Zeitpunkt, zu dem das Token ausgegeben wurde.
exp Der Zeitpunkt, zu dem das Token abläuft.

$Standort

Eine Variable, die verwendet werden kann, um auf den Schlüssel einer $location zu verweisen, die zuvor in einer Regelstruktur verwendet wurde.

Wenn Ihre Regelstruktur einen $location enthält, können Sie eine entsprechende $ -Variable in Ihrem Regelausdruck verwenden, um den Namen des tatsächlich gelesenen oder geschriebenen untergeordneten Elements abzurufen. Angenommen, wir möchten jedem Benutzer Lese- und Schreibzugriff auf seinen eigenen Speicherort /users/<user> gewähren. Wir könnten verwenden:

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

Wenn ein Client versucht /users/barney zuzugreifen, stimmt der Standardspeicherort $user überein, wobei $user gleich „barney“ ist. Die .read Regel prüft also, ob auth.uid === 'barney' . Daher ist das Lesen von /users/barney nur dann erfolgreich, wenn der Client mit der UID „barney“ authentifiziert ist.

Jetzt

Enthält die Anzahl der Millisekunden seit der Unix-Epoche gemäß den Firebase Realtime Database-Servern.

Die Variable now enthält die Anzahl der Millisekunden seit der UNIX-Epoche gemäß den Firebase Realtime Database-Servern. Sie könnten dies beispielsweise verwenden, um zu überprüfen, ob die von einem Benutzer created Zeit niemals auf eine Zeit in der Zukunft festgelegt wird:

{
  "rules": {
    "users": {
      "$user": {
        "created": {
          ".validate": "newData.val() < now"
        }
      }
    }
  }
}

Wurzel

Ein RuleDataSnapshot , der den aktuellen Daten im Stammverzeichnis Ihrer Firebase-Echtzeitdatenbank entspricht.

Die Stammvariable gibt Ihnen einen RuleDataSnapshot, der den aktuellen Daten im Stammverzeichnis Ihrer Firebase-Echtzeitdatenbank entspricht. Damit können Sie beliebige Daten in Ihrer Datenbank in Ihren Regelausdrücken lesen. Wenn wir beispielsweise Benutzern erlauben wollten, /comments nur zu lesen, wenn ihr /users/<id>/active auf „true“ gesetzt war, könnten wir Folgendes verwenden:

{
  "rules": {
    "comments": {
      ".read": "root.child('users').child(auth.uid).child('active').val() == true"
    }
  }
}

Wenn dann /users/barney/active den Wert true enthielt, könnte ein mit der UID „barney“ authentifizierter Benutzer in den /comments Knoten schreiben.

Daten

Ein RuleDataSnapshot , der den aktuellen Daten in der Firebase Realtime Database am Speicherort der aktuell ausgeführten Regel entspricht.

Die Datenvariable liefert Ihnen einen RuleDataSnapshot , der den aktuellen Daten im Datenbankspeicherort der aktuell ausgeführten Regel entspricht (im Gegensatz zu root, das Ihnen die Daten für das Stammverzeichnis Ihrer Datenbank liefert).

Wenn Sie beispielsweise jedem Client den Zugriff auf /users/<user> erlauben möchten, wenn /users/<user>/public auf „true“ gesetzt ist, können Sie Folgendes verwenden:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "data.child('public').val() == true"
      }
    }
  }
}

Die Datenvariable ist in den Regeln .read , .write und .validate verfügbar.

neue Daten

Ein RuleDataSnapshot , der den Daten entspricht, die entstehen, wenn das Schreiben zulässig ist.

Für .write und .validate Regeln liefert Ihnen die Variable newData einen RuleDataSnapshot , der den Daten entspricht, die sich ergeben, wenn das Schreiben zulässig ist (es handelt sich um eine „Zusammenführung“ der vorhandenen Daten plus der neuen Daten, die geschrieben werden). Wenn Sie also sicherstellen möchten, dass jeder Benutzer einen Namen und ein Alter hat, können Sie Folgendes verwenden:

{
  "rules": {
    "users": {
      "$user": {
        ".read": true,
        ".write": true,
        ".validate": "newData.hasChildren(['name', 'age'])"
      }
    }
  }
}

Da newData vorhandene und neue Daten zusammenführt, verhält es sich auch bei „teilweisen“ Aktualisierungen ordnungsgemäß. Zum Beispiel:

var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();

Die Variable newData ist in .read Regeln nicht verfügbar, da keine neuen Daten geschrieben werden. Sie sollten einfach Daten verwenden.

RuleDataSnapshot: Methoden

val()

Ruft den Grundwert ( string , number , boolean oder null ) aus diesem RuleDataSnapshot ab.

Rückgabewert : ( String , Number , Boolean , Null ) – Der Grundwert aus diesem RuleDataSnapshot .

Im Gegensatz zu DataSnapshot.val() wird beim Aufruf von val() für einen RuleDataSnapshot mit untergeordneten Daten kein Objekt zurückgegeben, das die untergeordneten Daten enthält. Stattdessen wird ein spezieller Sentinel-Wert zurückgegeben. Dadurch wird sichergestellt, dass die Regeln stets äußerst effizient arbeiten können.

Daher müssen Sie immer child() verwenden, um auf untergeordnete Elemente zuzugreifen (z. B. data.child('name').val() , nicht data.val().name ).

In diesem Beispiel ist das Lesen nur dann möglich, wenn das untergeordnete isReadable-Element an der gelesenen Position auf „true“ gesetzt ist.

".read": "data.child('isReadable').val() == true"

Kind()

Ruft einen RuleDataSnapshot für den Speicherort am angegebenen relativen Pfad ab.

Argumente : childPath String – Ein relativer Pfad zum Speicherort der untergeordneten Daten.

Rückgabewert : RuleDataSnapshot – Der RuleDataSnapshot für den untergeordneten Standort.

Der relative Pfad kann entweder ein einfacher untergeordneter Name (z. B. „fred“) oder ein tieferer, durch Schrägstriche getrennter Pfad (z. B. „fred/name/first“) sein. Wenn der untergeordnete Speicherort keine Daten enthält, wird ein leerer RuleDataSnapshot zurückgegeben.

In diesem Beispiel ist das Lesen nur dann möglich, wenn das untergeordnete isReadable-Element an der gelesenen Position auf „true“ gesetzt ist.

".read": "data.child('isReadable').val() == true"

Elternteil()

Ruft einen RuleDataSnapshot für den übergeordneten Standort ab.

Rückgabewert : RuleDataSnapshot – Der RuleDataSnapshot für den übergeordneten Standort.

Wenn diese Instanz auf das Stammverzeichnis Ihrer Firebase-Echtzeitdatenbank verweist, hat sie kein übergeordnetes Element und parent() schlägt fehl, wodurch der aktuelle Regelausdruck übersprungen wird (als Fehler).

Dieses Beispiel erlaubt nur das Lesen, wenn das isReadable-Geschwister auf true gesetzt ist.

".read": "data.parent().child('isReadable').val() == true"

hasChild(childPath)

Gibt true zurück, wenn das angegebene untergeordnete Element existiert.

Argumente : childPath String – Ein relativer Pfad zum Standort eines potenziellen untergeordneten Elements.

Rückgabewert : Booleantrue , wenn Daten im angegebenen untergeordneten Pfad vorhanden sind; sonst false .

In diesem Beispiel können die Daten nur geschrieben werden, wenn sie einen untergeordneten „Namen“ enthalten.

".validate": "newData.hasChild('name')"

hasChildren([Kinder])

Überprüft die Existenz von Kindern.

Argumente : children Array optional – Ein Array von untergeordneten Schlüsseln, die alle vorhanden sein müssen.

Rückgabewert : Booleantrue , wenn (die angegebenen) untergeordneten Elemente vorhanden sind; sonst false .

Wenn keine Argumente angegeben werden, wird „true“ zurückgegeben, wenn der RuleDataSnapshot über untergeordnete Elemente verfügt. Wenn ein Array mit untergeordneten Namen bereitgestellt wird, wird nur dann „true“ zurückgegeben, wenn alle angegebenen untergeordneten Elemente im RuleDataSnapshot vorhanden sind.

In diesem Beispiel können die Daten nur geschrieben werden, wenn sie ein oder mehrere untergeordnete Elemente enthalten.

".validate": "newData.hasChildren()"

In diesem Beispiel können die Daten nur geschrieben werden, wenn sie untergeordnete Elemente vom Typ „Name“ und „Alter“ enthalten.

".validate": "newData.hasChildren(['name', 'age'])"

existiert()

Gibt „true“ zurück, wenn dieser RuleDataSnapshot Daten enthält.

Rückgabewert : Booleantrue , wenn der RuleDataSnapshot Daten enthält; sonst false .

Die Funktion „exists“ gibt „true“ zurück, wenn dieser RuleDataSnapshot Daten enthält. Es handelt sich lediglich um eine praktische Funktion, da data.exists() äquivalent zu data.val() != null ist.

In diesem Beispiel ist ein Schreibvorgang an dieser Stelle möglich, solange keine Daten vorhanden sind.

".write": "!data.exists()"

getPriority()

Ruft die Priorität der Daten in einem RuleDataSnapshot ab.

Rückgabewert : ( String , Number , Null ) – Die Priorität der Daten in diesem RuleDataSnapshot .

Dieses Beispiel stellt sicher, dass die neuen Daten, die geschrieben werden, Priorität haben

".validate": "newData.getPriority() != null"

ist Nummer()

Gibt „true“ zurück, wenn dieser RuleDataSnapshot einen numerischen Wert enthält.

Rückgabewert : Booleantrue , wenn die Daten numerisch sind; sonst false .

In diesem Beispiel wird sichergestellt, dass die neuen Daten, die geschrieben werden, ein untergeordnetes „Alter“ mit einem numerischen Wert haben.

".validate": "newData.child('age').isNumber()"

isString()

Gibt „true“ zurück, wenn dieser RuleDataSnapshot einen Zeichenfolgenwert enthält.

Rückgabewert : Booleantrue , wenn die Daten ein String sind; sonst false .

In diesem Beispiel wird sichergestellt, dass die neuen Daten, die geschrieben werden, einen untergeordneten „Namen“ mit einem Zeichenfolgenwert haben.

".validate": "newData.child('name').isString()

isBoolean()

Gibt „true“ zurück, wenn dieser RuleDataSnapshot einen booleschen Wert enthält.

Rückgabewert: Boolean Werttrue , wenn die Daten ein Boolean sind; sonst false .

In diesem Beispiel wird sichergestellt, dass die neu geschriebenen Daten über ein untergeordnetes Element „aktiv“ mit einem booleschen Wert verfügen.

".validate": "newData.child('active').isBoolean()"

Zeichenfolge: Eigenschaften

Länge

Gibt die Länge der Zeichenfolge zurück.

Rückgabewert : Number – Die Anzahl der Zeichen in der Zeichenfolge.

Für dieses Beispiel muss die Zeichenfolge mindestens 10 Zeichen lang sein.

".validate": "newData.isString() && newData.val().length >= 10"

String: Methoden

enthält(Teilzeichenfolge)

Gibt true zurück, wenn die Zeichenfolge die angegebene Teilzeichenfolge enthält.

Argumente : substring String – Eine Teilzeichenfolge, nach der gesucht werden soll.

Rückgabewert : Booleantrue , wenn die Zeichenfolge die angegebene Teilzeichenfolge enthält; sonst false .

In diesem Beispiel müssen die Daten eine Zeichenfolge sein, die „@“ enthält.

".validate": "newData.isString() && newData.val().contains('@')"

beginntMit(Teilzeichenfolge)

Gibt true zurück, wenn die Zeichenfolge mit der angegebenen Teilzeichenfolge beginnt.

Argumente : substring String – Eine Teilzeichenfolge, nach der am Anfang gesucht werden soll.

Rückgabewert : Booleantrue , wenn die Zeichenfolge die angegebene Teilzeichenfolge enthält; sonst false .

Dieses Beispiel erlaubt Lesezugriff, wenn auth.token.identifier mit „internal-“ beginnt.

".read": "auth.token.identifier.beginsWith('internal-')"

endetWith(substring)

Gibt true zurück, wenn die Zeichenfolge mit der angegebenen Teilzeichenfolge endet.

Argumente : substring String – Eine Teilzeichenfolge, nach der am Ende gesucht werden soll.

Rückgabewert : Booleantrue , wenn die Zeichenfolge mit der angegebenen Teilzeichenfolge endet; sonst false .

Dieses Beispiel ermöglicht Lesezugriff, wenn auth.token.identifier mit „@company.com“ endet.

".read": "auth.token.identifier.endsWith('@company.com')"

ersetzen(Teilzeichenfolge, Ersatz)

Gibt eine Kopie der Zeichenfolge zurück, wobei alle Instanzen einer angegebenen Teilzeichenfolge durch die angegebene Ersatzzeichenfolge ersetzt werden.

Argumente : substring String – Eine Teilzeichenfolge, nach der gesucht werden soll. replacement String – Eine Zeichenfolge, durch die die Teilzeichenfolge ersetzt werden soll.

Rückgabewert : String – Der neue String nach dem Ersetzen des Teilstrings durch Ersetzung.

Die Methode replace() unterscheidet sich geringfügig von der JavaScript-Methode replace() dadurch, dass sie alle Instanzen einer angegebenen Teilzeichenfolge durch die angegebene Ersatzzeichenfolge ersetzt, nicht nur die erste Instanz.

Da Punkte in Schlüsseln nicht zulässig sind, müssen wir Zeichenfolgen mit Punkten maskieren, bevor wir sie speichern. Ein Beispiel hierfür wären E-Mail-Adressen. Angenommen, wir hätten eine Liste mit E-Mail-Adressen auf der Whitelist in unserem /whitelist/ -Knoten:

{
 "user": {
   "$uid": {
     "email": <email>
   }
 },
 "whitelist": {
   "fred@gmail%2Ecom": true,
   "barney@aol%2Ecom": true
 }
}

Wir können eine Regel erstellen, die das Hinzufügen von Benutzern nur dann zulässt, wenn sich ihre E-Mail im /whitelist/ -Knoten befindet:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "true",
        ".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
      }
    }
  }
}

toLowerCase()

Gibt eine in Kleinbuchstaben konvertierte Kopie der Zeichenfolge zurück.

Rückgabewert : String – Der in Kleinbuchstaben konvertierte String.

Dieses Beispiel ermöglicht Lesezugriff, wenn auth.token.identifier nur in Kleinbuchstaben unter /users vorhanden ist.

".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"

toUpperCase()

Gibt eine in Großbuchstaben konvertierte Kopie der Zeichenfolge zurück.

Rückgabewert : String – Der in Großbuchstaben konvertierte String.

Dieses Beispiel ermöglicht Lesezugriff, wenn unter /users auth.token.identifier nur in Großbuchstaben geschrieben ist.

".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"

Übereinstimmungen (Regex)

Gibt true zurück, wenn die Zeichenfolge mit dem angegebenen regulären Ausdrucksliteral übereinstimmt.

Rückgabewert : Booleantrue , wenn die Zeichenfolge mit dem regulären Ausdrucksliteral, Regex, übereinstimmt; sonst false .

Sehen Sie sich die vollständige Regex-Dokumentation zu den Regeln an.

Betreiber

+ (hinzufügen)

Wird zum Hinzufügen von Variablen oder zur Zeichenfolgenverkettung verwendet.

Das folgende Beispiel stellt sicher, dass der neue Wert den vorhandenen Wert um genau eins erhöht. Dies ist nützlich für die Implementierung eines Zählers:

".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"

- (negieren oder subtrahieren)

Wird verwendet, um einen Wert zu negieren oder zwei Werte in einem Regelausdruck zu subtrahieren.

Diese Validierungsregel prüft, ob der neue Wert die Umkehrung eines untergeordneten Werts an der Position ist:

".validate": "newData.val() === -(data.child('quantity').val())"

Im folgenden Beispiel wird durch Subtraktion sichergestellt, dass nur Nachrichten der letzten zehn Minuten gelesen werden können:

".read": "newData.child('timestamp').val() > (now - 600000)"

* (multiplizieren)

Wird zum Multiplizieren von Variablen in einem Regelausdruck verwendet.

Diese Validierungsregel prüft, ob der neue Wert dem Produkt aus Preis und Menge (zwei vorhandenen Werten) entspricht:

".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"

/ (teilen)

Wird zum Teilen von Variablen in einem Regelausdruck verwendet.

Im folgenden Beispiel stellt die Validierungsregel sicher, dass die gespeicherten Daten dem Durchschnitt der gesamten an anderer Stelle gespeicherten Daten entsprechen:

".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"

% (Modul)

Wird verwendet, um den Rest der Division einer Variablen durch eine andere in einem Regelausdruck zu ermitteln.

Diese Regel bestätigt, dass nur gerade Zahlen geschrieben werden können:

".validate": "newData.val() % 2 === 0"

=== (gleich)

Wird verwendet, um zu prüfen, ob zwei Variablen in einem Regelausdruck denselben Typ und Wert haben.

Die folgende Regel verwendet den ===-Operator, um Schreibzugriff nur dem Besitzer des Benutzerkontos zu gewähren. Die UID des Benutzers muss genau mit dem Schlüssel ( $user_id ) übereinstimmen, damit die Regel als wahr ausgewertet wird.

"users": {
  ".write": "$user_id === auth.uid"
}

!== (nicht gleich)

Wird verwendet, um zu prüfen, ob zwei Variablen in einem Regelausdruck ungleich sind.

Die folgende Leseregel stellt sicher, dass nur angemeldete Benutzer Daten lesen können:

".read": "auth !== null"

&& (UND)

Wird als wahr ausgewertet, wenn beide Operanden wahr sind. Wird verwendet, um mehrere Bedingungen in einem Regelausdruck auszuwerten.

Die folgende Validierungsregel prüft, ob es sich bei den neuen Daten um eine Zeichenfolge mit weniger als 100 Zeichen handelt:

".validate": "newData.isString() && newData.val().length < 100"

|| (ODER)

Wird als wahr ausgewertet, wenn ein Operand im Regelausdruck wahr ist.

In diesem Beispiel können wir schreiben, solange keine alten oder neuen Daten vorhanden sind. Mit anderen Worten: Wir können schreiben, wenn wir Daten löschen oder erstellen, aber keine Daten aktualisieren.

".write": "!data.exists() || !newData.exists()"

! (NICHT)

Wird als wahr ausgewertet, wenn sein einzelner Operand falsch ist. In Regelausdrücken ist das ! Der Operator wird häufig verwendet, um festzustellen, ob Daten an einen Speicherort geschrieben wurden.

Die folgende Regel erlaubt einen Schreibzugriff nur, wenn sich am angegebenen Ort keine Daten befinden:

".write": "!data.exists()"

> (größer als)

Wird verwendet, um zu überprüfen, ob ein Wert größer als ein anderer Wert in einem Regelausdruck ist.

Diese Validierungsregel prüft, ob die geschriebene Zeichenfolge keine leere Zeichenfolge ist:

".validate": "newData.isString() && newData.val().length > 0"

< (weniger als)

Wird verwendet, um zu prüfen, ob ein Wert kleiner als ein anderer Wert in einem Regelausdruck ist.

Diese Validierungsregel prüft, ob eine Zeichenfolge weniger als 20 Zeichen umfasst:

".validate": "newData.isString() && newData.val().length < 20"

>= (größer oder gleich)

Wird verwendet, um zu prüfen, ob ein Wert größer oder gleich einem anderen Wert in einem Regelausdruck ist.

Diese Validierungsregel prüft, ob die geschriebene Zeichenfolge keine leere Zeichenfolge ist:

".validate": "newData.isString() && newData.val().length >= 1"

<= (kleiner oder gleich)

Wird verwendet, um zu überprüfen, ob ein Wert kleiner oder gleich einem anderen Wert in einem Regelausdruck ist.

Diese Validierungsregel stellt sicher, dass in Zukunft keine neuen Daten hinzugefügt werden können:

".validate": "newData.val() <= now"

? (ternärer Operator)

Wird zum Auswerten eines bedingten Regelausdrucks verwendet.

Der ternäre Operator benötigt drei Operanden. Der Operand vor dem ? ist die Bedingung. Wenn die Bedingung wahr ist, wird der zweite Operand ausgewertet. Wenn die Bedingung falsch ist, wird der dritte Operand ausgewertet.

Für die folgende Validierungsregel kann der neue Wert eine Zahl oder ein boolescher Wert sein. Wenn es sich um eine Zahl handelt, muss sie größer als 0 sein.

".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"