Referenz zu Firebase-Sicherheitsregeln für Cloud-Speicher

Firebase-Sicherheitsregeln für Cloud Storage werden verwendet, um zu bestimmen, wer Lese- und Schreibzugriff auf Dateien hat, die im Cloud Storage gespeichert sind, sowie um zu bestimmen, wie Dateien strukturiert sind und welche Metadaten sie enthalten. Cloud-Speicher-Sicherheitsregeln bestehen aus Regeln, die die request und resource berücksichtigen, um eine gewünschte Aktion zuzulassen oder zu verweigern, z. B. das Hochladen einer Datei oder das Abrufen von Dateimetadaten. Diese Referenzdokumente behandeln die Regeltypen, die Eigenschaften einer request und einer resource , die von Cloud Storage Security Rules verwendeten Datentypen und wie Fehler auftreten.

Regel

Eine rule ist ein Ausdruck, der ausgewertet wird, um zu bestimmen, ob eine request eine gewünschte Aktion ausführen darf.

Typen

Erlauben

allow Regeln bestehen aus einer Methode, wie etwa read oder write , sowie einer optionalen Bedingung. Wenn eine Regel ausgeführt wird, wird die Bedingung ausgewertet, und wenn die Bedingung „ true ergibt, ist die gewünschte Methode zulässig; andernfalls wird die Methode abgelehnt. Eine allow ohne Bedingung lässt immer die gewünschte Methode zu.

// Always allow method
allow <method>;

// Allow method if condition is true
allow <method>: if <condition>;

Derzeit ist allow der einzige unterstützte Regeltyp.

Anforderungsmethoden

Lesen

Die read deckt alle Anfragen ab, bei denen Dateidaten oder Metadaten gelesen werden, einschließlich Datei-Downloads und Datei-Metadaten-Lesevorgängen.

// Always allow reads
allow read;

// Allow reads if condition evaluates to true
allow read: if <condition>;

Schreiben

Die write deckt alle Anfragen ab, bei denen Dateidaten oder Metadaten geschrieben werden, einschließlich Datei-Uploads, Dateilöschungen und Dateimetadatenaktualisierungen.

// Always allow writes
allow write;

// Allow writes if condition evaluates to true
allow write: if <condition>;

Übereinstimmen

Regeln werden ausgeführt, wenn eine request (z. B. ein Datei-Upload oder -Download) mit einem von einer Regel abgedeckten Dateipfad übereinstimmt. Eine match besteht aus einem Pfad und einem Körper, der mindestens eine allow enthalten muss. Wenn kein Pfad übereinstimmt, wird die Anfrage abgelehnt.

Sie können einen vollständig benannten Pfad match oder Platzhalter einfügen, um alle Pfade abzugleichen, die einem bestimmten Muster entsprechen.

Pfadsegmente

single_segment

Sie können einzelne Pfadsegmente verwenden, um eine Regel zu erstellen, die einer im Cloud Storage gespeicherten Datei entspricht.

// Allow read at "path" if condition evaluates to true
match /path {
  allow read: if <condition>;
}

Auch mehrere Pfadsegmente und verschachtelte Pfade sind zulässig:

// Allow read at "path/to/object" if condition evaluates to true
match /path {
  match /to {
    match /object {
      allow read: if <condition>;
    }
  }
}

{single_segment_wildcard}

Wenn Sie eine Regel auf mehrere Dateien im selben Pfad anwenden möchten, können Sie ein Platzhalter-Pfadsegment verwenden, um alle Dateien in einem bestimmten Pfad abzugleichen. Eine Platzhaltervariable wird in einem Pfad deklariert, indem eine Variable in geschweifte Klammern eingeschlossen wird: {variable} . Auf diese Variable kann innerhalb der Match-Anweisung als string zugegriffen werden.

// Allow read at any path "/*", if condition evaluates to true
match /{single_path} {
  // Matches "path", "to", or "object" but not "path/to/object"
  allow read: if <condition>;
}

Mehrere Pfadsegmente und verschachtelte Pfade können auch Platzhalter haben:

// Allow read at any path "/path/*/newPath/*", if condition evaluates to true
match /path/{first_wildcard} {
  match /newPath/{second_wildcard} {
    // Matches "path/to/newPath/newObject" or "path/from/newPath/oldObject"
    allow read: if <condition>;
  }
}

{multi_segment_wildcard=**}

Wenn Sie eine beliebige Anzahl von Pfadsegmenten an oder unterhalb eines Pfads abgleichen möchten, können Sie einen Platzhalter für mehrere Segmente verwenden, der alle Anforderungen an und unterhalb des Standorts abgleicht. Dies kann nützlich sein, um einem Benutzer seinen eigenen freien Speicherplatz zur Verfügung zu stellen oder Regeln zu erstellen, die vielen verschiedenen Pfadsegmenten entsprechen (z. B. um einen öffentlich lesbaren Satz von Dateien zu erstellen oder um eine Authentifizierung für alle Schreibvorgänge zu erfordern).

Ein Platzhalterpfad mit mehreren Segmenten wird ähnlich wie ein Platzhalterpfad mit einem einzelnen Segment deklariert, mit dem Zusatz =** am Ende der Variablen: {variable=**} . Eine Multisegment-Wildcard-Variable steht innerhalb der Match-Anweisung als path zur Verfügung.

// Allow read at any path "/**", if condition evaluates to true
match /{multi_path=**} {
  // Matches anything at or below this, from "path", "path/to", "path/to/object", ...
  allow read: if <condition>;
}

Anfrage

Die request wird innerhalb einer Bedingung bereitgestellt, um die auf diesem Pfad gestellte Anforderung darzustellen. Die request verfügt über eine Reihe von Eigenschaften, anhand derer entschieden werden kann, ob die eingehende Anfrage zugelassen wird.

Eigenschaften

auth

Wenn ein authentifizierter Benutzer eine Anfrage an Cloud Storage durchführt, wird die auth mit der uid des Benutzers ( request.auth.uid ) sowie den Ansprüchen des Firebase Authentication JWT ( request.auth.token ) gefüllt.

request.auth.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 request.auth.token auch alle vom Entwickler angegebenen benutzerdefinierten Ansprüche.

Wenn ein nicht authentifizierter Benutzer eine Anfrage ausführt, ist request.auth null .

// Allow requests from authenticated users
allow read, write: if request.auth != null;

path

Die path enthält den Pfad, für den eine request ausgeführt wird.

// Allow a request if the first path segment equals "images"
allow read, write: if request.path[0] == 'images';

resource

Die resource enthält die Metadaten einer hochgeladenen Datei oder die aktualisierten Metadaten für eine vorhandene Datei. Dies hängt mit der resource zusammen, die im Gegensatz zu den neuen Metadaten die aktuellen Dateimetadaten im angeforderten Pfad enthält.

// Allow a request if the new value is smaller than 5MB
allow read, write: if request.resource.size < 5 * 1024 * 1024;

request.resource enthält die folgenden Eigenschaften von resource :

Eigentum
name
bucket
metadata
size
contentType

time

Die time enthält einen Zeitstempel, der die aktuelle Serverzeit darstellt, zu der eine Anfrage ausgewertet wird. Damit können Sie zeitbasierten Zugriff auf Dateien ermöglichen, z. B. das Hochladen von Dateien nur bis zu einem bestimmten Datum oder das Lesen von Dateien nur bis zu einer Stunde nach dem Hochladen zulassen.

// Allow a read if the file was created less than one hour ago
allow read: if request.time < resource.timeCreated + duration.value(1, 'h');

Es stehen viele Funktionen zum Schreiben von Regeln unter Verwendung von Zeitstempeln und Dauern zur Verfügung.

Ressource

Die resource enthält Dateimetadaten für Dateien in Cloud Storage, z. B. Dateiname, Größe, Erstellungszeit und benutzerdefinierte Metadaten.

Eigenschaften

name

Eine Zeichenfolge, die den vollständigen Namen der Datei enthält, einschließlich des Pfads zur Datei.

// Allow reads if the resource name is "path/to/object"
allow read: if resource.name == 'path/to/object'

bucket

Eine Zeichenfolge, die den Google Cloud Storage- Bucket enthält, in dem diese Datei gespeichert ist.

// Allow reads of all resources in your bucket
allow read: if resource.bucket == '<your-cloud-storage-bucket>'

generation

Ein int, der die Google Cloud Storage- Objektgenerierung der Datei enthält. Wird zur Objektversionierung verwendet.

// Allow reads if the resource matches a known object version
allow read: if resource.generation == <known-generation>

metageneration

Ein int, der die Metagenerierung des Google Cloud Storage-Objekts der Datei enthält. Wird zur Objektversionierung verwendet.

// Allow reads if the resource matches a known object metadata version
allow read: if resource.metageneration == <known-generation>

size

Ein int, der die Dateigröße in Bytes enthält.

// Allow reads if the resource is less than 10 MB
allow read: if resource.size < 10 * 1024 * 1024;

timeCreated

Ein Zeitstempel, der angibt, wann die Datei erstellt wurde.

// Allow reads if the resource was created less than an hour ago
allow read: if resource.timeCreated < request.time + duration.value(60, "m")

updated

Ein Zeitstempel, der angibt, wann die Datei zuletzt aktualisiert wurde.

// Allow reads if the resource was updated less than an hour ago
allow read: if resource.updated < request.time + duration.value(60, "m")

md5Hash

Eine Zeichenfolge, die den MD5-Hash der Datei enthält.

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.md5Hash == resource.md5Hash;

crc32c

Eine Zeichenfolge, die den crc32c-Hash der Datei enthält.

// Allow writes if the hash of the uploaded file is the same as the existing file
allow write: if request.resource.crc32c == resource.crc32c;

etag

Eine Zeichenfolge, die das Etag der Datei enthält.

// Allow writes if the etag matches a known object etag
allow write: if resource.etag == <known-generation>

contentDisposition

Eine Zeichenfolge, die die Inhaltsdisposition der Datei enthält.

// Allow reads if the content disposition matches a certain value
allow read: if resource.contentDisposition == 'inlined';

contentEncoding

Eine Zeichenfolge, die die Inhaltskodierung der Datei enthält.

// Allow reads if the content is encoded with gzip
allow read: if resource.contentEncoding == 'gzip';

contentLanguage

Eine Zeichenfolge, die die Inhaltssprache der Datei enthält.

// Allow reads if the content language is Japanese
allow read: if resource.contentLanguage == 'ja';

contentType

Eine Zeichenfolge, die den Inhaltstyp der Datei enthält.

// Allow reads if the content type is PNG.
allow read: if resource.contentType == 'image/png';

metadata

Eine Map<String, String> die zusätzliche, vom Entwickler bereitgestellte Metadatenfelder enthält.

// Allow reads if a certain metadata field matches a desired value
allow read: if resource.metadata.customProperty == 'customValue';

firestore.get und firestore.exists

Mit den Funktionen firestore.get() und firestore.exists() können Sie auf Dokumente in Cloud Firestore zugreifen, um komplexe Autorisierungskriterien auszuwerten.

Die Funktionen firestore.get() und firestore.exists() erwarten beide vollständig angegebene Dokumentpfade. Wenn Sie Variablen verwenden, um Pfade für firestore.get() und firestore.exists() zu erstellen, müssen Sie Variablen mithilfe der $(variable) -Syntax explizit maskieren.

firestore.get

Rufen Sie den Inhalt eines Cloud Firestore-Dokuments ab.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.uid)).data.memberships
    }
  }
}

firestore.exists

Überprüfen Sie, ob ein Cloud Firestore-Dokument vorhanden ist.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.uid))
    }
  }
}

Service

Der service ist die erste Deklaration in einer Cloud Storage-Sicherheitsregeldatei und gibt an, für welchen Dienst diese Regeln gelten.

Name

name

Der Name der Dienstregeln wird angewendet. Der einzige aktuelle Wert ist firebase.storage .

// Specify the service name
service firebase.storage {
  match /b/{bucket}/o {
    ...
  }
}

Datentypen

Mit der Regelsprache können Sie den Typ mithilfe des is Operators überprüfen.

// For example
a is null
a is string

null

Der null Datentyp stellt einen Wert dar, der nicht existiert.

allow read: if request.auth != null;

bool

Der bool Typ stellt einen booleschen true oder false Wert dar.

allow read: if true;   // always succeeds
allow write: if false; // always fails

Vergleich

Boolesche Werte können mit den == Operatoren != verglichen werden.

Boolesche Operationen

Betrieb Ausdruck
AND x && y
OR x || y
NOT !x

Operationen schließen kurz und können entweder true , false oder einen Error zurückgeben.

allow read: if true || false;   // always succeeds, short circuits at true
allow write: if false && true; // always fails, short circuits at false

int und float

Die Typen int und float stellen Zahlen dar. Ints sind: 0 , 1 , -2 usw., während Floats sind: 1.0 , -2.0 , 3.33 usw.

Ints sind vorzeichenbehaftete 64-Bit-Werte und Floats sind 64-Bit-IEEE 754-konforme Werte. Werte vom Typ int werden in float umgewandelt, wenn sie in Vergleichen und arithmetischen Operationen mit einem float -Wert verwendet werden.

Vergleich

Ints und Floats können mit den Operatoren == , != , > , < , >= und <= verglichen und sortiert werden.

Arithmetik

Ints und Floats können addiert, subtrahiert, multipliziert, dividiert, moduliert und negiert werden:

Betrieb Ausdruck
Zusatz x + y
Subtraktion x - y
Multiplikation x * y
Aufteilung x / y
Modulo x % y
Negation -x

Mathematische Funktionen

Firebase Security Rules for Cloud Storage bietet außerdem eine Reihe mathematischer Hilfsfunktionen zur Vereinfachung von Ausdrücken:

Funktion Beschreibung
math.ceil(x) Obergrenze des numerischen Werts
math.floor(x) Untergrenze des numerischen Werts
math.round(x) Runden Sie den Eingabewert auf den nächsten ganzzahligen Wert
math.abs(x) Absoluter Wert der Eingabe
math.isInfinite(x) Testen Sie, ob der Wert ±∞ ist, und geben Sie einen bool zurück
math.isNaN(x) Testen Sie, ob der Wert keine Zahl ist. NaN gibt einen bool zurück

string

Vergleich

Zeichenfolgen können mithilfe der Operatoren == , != , > , < , >= und <= lexografisch verglichen und sortiert werden.

Verkettung

Zeichenfolgen können mit dem Operator + verkettet werden.

// Concatenate a file name and extension
'file' + '.txt'

Index und Bereich

Der index string[] gibt eine Zeichenfolge zurück, die das Zeichen am angegebenen Index in der Zeichenfolge enthält.

// Allow reads of files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

Der range string[i:j] gibt eine Zeichenfolge zurück, die die Zeichen zwischen den angegebenen Indizes enthält, von i (einschließlich) bis j (exklusiv). Wenn i oder j nicht angegeben sind, werden standardmäßig 0 bzw. die Größe der Zeichenfolge verwendet. Es muss jedoch mindestens i oder j angegeben werden, damit der Bereich gültig ist.

// Allow reads of files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

Die index und range geben einen Fehler aus, wenn die bereitgestellten Indizes die Zeichenfolgengrenzen überschreiten.

size

Gibt die Anzahl der Zeichen in der Zeichenfolge zurück.

// Allow files with names less than 10 characters
match /{fileName} {
  allow write: if fileName.size() < 10;
}

matches

Führt eine Übereinstimmung mit regulären Ausdrücken durch und gibt true zurück, wenn die Zeichenfolge mit dem angegebenen regulären Ausdruck übereinstimmt. Verwendet die Google RE2-Syntax .

// Allow writes to files which end in ".txt"
match /{fileName} {
  allow write: if fileName.matches('.*\\.txt')
}

split

Teilt eine Zeichenfolge gemäß einem bereitgestellten regulären Ausdruck und gibt eine list von Zeichenfolgen zurück. Verwendet die Google RE2-Syntax .

// Allow files named "file.*" to be uploaded
match /{fileName} {
  allow write: if fileName.split('.*\\..*')[0] == 'file'
}

path

Pfade sind verzeichnisähnliche Namen mit optionalem Mustervergleich. Das Vorhandensein eines Schrägstrichs / kennzeichnet den Beginn eines Pfadsegments.

path

Konvertiert ein string Argument in einen path .

// Allow reads on a specific file path
match /{allFiles=**} {
  allow read: if allFiles == path('/path/to/file');
}

timestamp

Zeitstempel sind in UTC angegeben, wobei mögliche Werte bei 0001-01-01T00.00.00Z beginnen und bei 9999-12-31T23.59.59Z enden.

Vergleich

Zeitstempel können mit den Operatoren == , != , > , < , >= und <= verglichen und sortiert werden.

Arithmetik

Zeitstempel unterstützen die Addition und Subtraktion zwischen Zeitstempeln und Dauern wie folgt:

Ausdruck Ergebnis
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

Ein timestamp , der nur year , month und day enthält.

// Allow reads on the same day that the resource was created.
allow read: if request.time.date() == resource.timeCreated.date()

year

Der Jahreswert als Ganzzahl, von 1 bis 9999.

// Allow reads on all requests made before 2017
allow read: if request.time.year() < 2017

month

Der Monatswert als int, von 1 bis 12.

// Allow reads on all requests made during the month of January
allow read: if request.time.month() == 1;

day

Der aktuelle Tag des Monats als int, von 1 bis 31.

// Allow reads on all requests made during the first day of each month
allow read: if request.time.day() == 1;

time

Ein duration , der die aktuelle Zeit enthält.

// Allow reads on all requests made before 12PM
allow read: if request.time.time() < duration.time(12, 0, 0, 0);

hours

Der Stundenwert als Ganzzahl, von 0 bis 23.

// Allow reads on all requests made before 12PM
allow read: if request.time.hours() < 12;

minutes

Der Minutenwert als Ganzzahl, von 0 bis 59.

// Allow reads during even minutes of every hour
allow read: if request.time.minutes() % 2 == 0;

seconds

Der Sekundenwert als Ganzzahl, von 0 bis 59.

// Allow reads during the second half of each minute
allow read: if request.time.seconds() > 29;

nanos

Die Sekundenbruchteile in Nanos als int.

// Allow reads during the first 0.1 seconds of each second
allow read: if request.time.nanos() < 100000000;

dayOfWeek

Der Wochentag, von 1 (Montag) bis 7 (Sonntag).

// Allow reads on weekdays (Monday to Friday)
allow read: if request.time.dayOfWeek() < 6;

dayOfYear

Der Tag des aktuellen Jahres, von 1 bis 366.

// Allow reads every fourth day
allow read: if request.time.dayOfYear() % 4 == 0;

toMillis

Gibt die aktuelle Anzahl an Millisekunden seit der Unix-Epoche zurück.

// Allow reads if the request is made before a specified time
allow read: if request.time.toMillis() < <milliseconds>;

duration

Dauerwerte werden als Sekunden plus Sekundenbruchteile in Nanosekunden dargestellt.

Vergleich

Dauern können mit den Operatoren == , != , > , < , >= und <= verglichen und geordnet werden.

Arithmetik

Dauern unterstützen die Addition und Subtraktion zwischen Zeitstempeln und Dauern wie folgt:

Ausdruck Ergebnis
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

Die Anzahl der Sekunden in der aktuellen Dauer. Muss zwischen -315.576.000.000 und +315.576.000.000 (einschließlich) liegen.

nanos

Die Anzahl der Sekundenbruchteile (in Nanosekunden) der aktuellen Dauer. Muss zwischen -999.999.999 und +999.999.999 (einschließlich) liegen. Für Sekunden ungleich Null und Nanosekunden ungleich Null müssen die Vorzeichen beider übereinstimmen.

duration.value

Dauern können mit der Funktion duration.value(int magnitude, string units) erstellt werden, die aus der angegebenen Größe und Einheit eine Zeitdauer erstellt.

// All of these durations represent one hour:
duration.value(1, "h")
duration.value(60, "m")
duration.value(3600, "s")

Mögliche unit sind:

Dauer unit
Wochen w
Tage d
Std h
Protokoll m
Sekunden s
Millisekunden ms
Nanosekunden ns

duration.time

Dauern können mit der Funktion duration.time(int hours, int minutes, int seconds, int nanoseconds) erstellt werden, die eine Zeitdauer der angegebenen Stunden, Minuten, Sekunden und Nanosekunden erstellt.

// Create a four hour, three minute, two second, one nanosecond duration
duration.time(4, 3, 2, 1)

list

Eine Liste enthält ein geordnetes Array von Werten, die folgende Typen haben können: null , bool , int , float , string , path , list , map , timestamp oder duration .

Gegeben sind x und y vom Typ list und i und j vom Typ int

Schaffung

Um eine Liste zu erstellen, fügen Sie Werte in Klammern ein:

// Create a list of strings
['apples', 'grapes', 'bananas', 'cheese', 'goats']

Vergleich

Listen können mit den == Operatoren != verglichen werden. Die Gleichheit zweier Listen erfordert, dass alle Werte gleich sind.

Index und Bereich

Der index list[] gibt das Element am angegebenen Index in der Liste zurück.

// Allow reads of all files that begin with 'a'
match /{fileName} {
  allow read: if fileName[0] == 'a';
}

Der range list[i:j] gibt alle Elemente in einer Liste zwischen den angegebenen Indizes zurück, von i (einschließlich) bis j (exklusiv). Wenn i oder j nicht angegeben sind, werden standardmäßig 0 bzw. die Größe der Liste verwendet. Es muss jedoch mindestens i oder j angegeben werden, damit der Bereich gültig ist.

// Allow reads of all files that begin with 'abcdef'
match /{fileName} {
  allow read: if fileName[0:6] == 'abcdef';
}

in

Gibt true zurück, wenn der gewünschte Wert in der Liste vorhanden ist, oder false , wenn er nicht vorhanden ist.

// Allow read if a filename has the string 'txt' in it
match /{fileName} {
  allow read: if 'txt' in fileName.split('\\.');
}

join

Kombiniert eine Liste von Zeichenfolgen zu einer einzelnen Zeichenfolge, getrennt durch die angegebene Zeichenfolge.

// Allow reads if the joined array is 'file.txt'
allow read: if ['file', 'txt'].join('.') == 'file.txt';

size

Die Anzahl der Elemente in der Liste.

// Allow read if there are three items in our list
allow read: if ['foo', 'bar', 'baz'].size() == 3;

hasAll

Gibt true zurück, wenn alle Werte in der Liste vorhanden sind.

// Allow read if one list has all items in the other list
allow read: if ['file', 'txt'].hasAll(['file', 'txt']);

map

Eine Karte enthält Schlüssel/Wert-Paare, wobei Schlüssel Zeichenfolgen sind und die Werte Folgendes sein können: null , bool , int , float , string , path , list , map , timestamp oder duration .

Schaffung

Um eine Karte zu erstellen, fügen Sie Schlüssel/Wert-Paare zwischen geschweiften Klammern ein:

// Create a map of strings to strings
{
  'mercury': 'mars',
  'rain': 'cloud',
  'cats': 'dogs',
}

Vergleich

Karten können mit den == Operatoren != verglichen werden. Die Gleichheit zweier Karten erfordert, dass alle Schlüssel in beiden Karten vorhanden sind und alle Werte gleich sind.

Index

Der Zugriff auf Werte in einer Karte erfolgt entweder über die Klammer- oder Punktnotation:

// Access custom metadata properties
allow read: if resource.metadata.property == 'property'
allow write: if resource.metadata['otherProperty'] == 'otherProperty'

Wenn ein Schlüssel nicht vorhanden ist, wird ein error zurückgegeben.

in

Gibt true zurück, wenn der gewünschte Schlüssel in der Karte vorhanden ist, oder false , wenn er nicht vorhanden ist.

// Allow reads if a property is present in the custom metadata
allow read: if property in resource.metadata;

size

Die Anzahl der Schlüssel in der Karte.

// Allow reads if there's exactly one custom metadata key
allow read: if resource.metadata.size() == 1;

keys

Eine Liste aller Schlüssel in der Karte.

// Allow reads if the first metadata key is 'myKey'
allow read: if resource.metadata.keys()[0] == 'myKey';

values

Eine Liste aller Werte in der Karte in der Schlüsselreihenfolge.

// Allow reads if the first metadata value is 'myValue'
allow read: if resource.metadata.values()[0] == 'myValue';

Fehler

Fehlerbewertung

Firebase-Sicherheitsregeln für Cloud Storage setzen die Auswertung fort, wenn Fehler auftreten. Dies ist nützlich, da bedingte && und || Ausdrücke können einen Fehler absorbieren, wenn die Bedingung andernfalls zu false “ bzw. „ true werden würde. Zum Beispiel:

Ausdruck Ergebnis
error && true error
error && false false
error || true true
error || false error

Häufige Fehlerquellen sind: Division durch Null, Zugriff auf Werte in einer Liste oder Karte, die nicht vorhanden sind, und Übergabe von Werten des falschen Typs an eine Funktion.

// Error if resource.size is zero
allow read: if 1000000 / resource.size;

// Error, key doesn't exist
allow read: if resource.metadata.nonExistentKey == 'value';

// Error, no unit 'y' exists
allow read: if request.time < resource.timeCreated + duration.value(1, 'y');