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');