Dokumentacja reguł zabezpieczeń Firebase dla Cloud Storage

Uprawnienia Firebase Security Rules w domenie Cloud Storage służą do określania, kto ma uprawnienia do odczytu i zapisu po pliki przechowywane w usłudze Cloud Storage oraz ich strukturę i jakie metadane zawierają. Cloud Storage Security Rules składają się z reguł, które request i resource, aby zezwolić na działanie lub je odrzucić, np. np. przesłanie pliku lub pobranie metadanych pliku. Te dokumenty opisują typy reguł, właściwości request i resource, dane typów używanych przez usługę Cloud Storage Security Rules i sposobów występowania błędów.

Reguła

rule to wyrażenie, które jest sprawdzane w celu określenia, czy request to mogą wykonać oczekiwane działanie.

Typy

Zezwól

Reguły allow składają się z metody, takiej jak read lub write, a także opcjonalny warunek. Gdy reguła jest wykonywana, sprawdzany jest warunek, jeśli warunek ma wartość true, dozwolona jest wybrana metoda; w przeciwnym razie, metoda jest odrzucana. Reguła allow bez warunku zawsze zezwala na wybranej metody.

// Always allow method
allow <method>;

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

Obecnie jedynym obsługiwanym typem reguły jest allow.

Metody żądania

Odczyt

Metoda read obejmuje wszystkie żądania, w przypadku których odczytywane są dane pliku lub metadane. w tym pobieranie plików i odczyty metadanych plików.

// Always allow reads
allow read;

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

Zapis

Metoda write obejmuje wszystkie żądania, w których zapisywane są dane pliku lub metadane, w tym przesyłania i usuwania plików oraz aktualizowania ich metadanych.

// Always allow writes
allow write;

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

Dopasowanie

Reguły są wykonywane, gdy użytkownik request (np. przesyła lub pobiera plik) pasuje do ścieżki pliku objętej regułą. Element match składa się ze ścieżki i treści, który musi zawierać co najmniej 1 regułę allow. Jeśli nie pasuje żadna ścieżka, żądanie został odrzucony.

Możesz match ścieżki z pełną nazwą lub wstawić symbole wieloznaczne, aby dopasować wszystkie które pasują do pewnych wzorców.

Segmenty ścieżki

single_segment

Za pomocą segmentów z jedną ścieżką możesz utworzyć regułę odpowiadającą zapisanym plikom w usłudze Cloud Storage.

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

Dozwolonych jest również wiele segmentów ścieżek i ścieżek zagnieżdżonych:

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

{single_segment_wildcard}

Jeśli chcesz zastosować regułę do wielu plików w tej samej ścieżce, możesz użyć funkcji segment ścieżki z symbolem wieloznacznym, aby dopasować wszystkie pliki w danej ścieżce. Zmienna z symbolem wieloznacznym jest zadeklarowana w ścieżce przez umieszczenie zmiennej w nawiasach klamrowych: {variable}. Ta zmienna jest dostępna w deklaracji dopasowania jako string.

// 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>;
}

Segmenty wielu ścieżek i ścieżek zagnieżdżonych też mogą zawierać symbole wieloznaczne:

// 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=**}

Jeśli chcesz dopasować dowolną liczbę segmentów ścieżki na ścieżce lub pod nią, możesz użyć opcji wielosegmentowy symbol wieloznaczny, który będzie dopasowywać wszystkie żądania do i poniżej pola lokalizacji. Może to być przydatne, gdy chcesz udostępnić użytkownikowi własne bezpłatne formularze miejsca na dane lub tworzenie reguł, które pasują do wielu różnych segmentów ścieżki (np. tak jak tworzenie dostępnego publicznie zbioru plików lub wymaganie uwierzytelniania wszystkich zapisów).

Wielosegmentowa ścieżka z symbolem wieloznacznym jest deklarowana podobnie jak pojedynczy segment symbol wieloznaczny z dodanym =** na końcu zmiennej: {variable=**} W dopasowaniu dostępna jest zmienna wielosegmentowa z symbolem wieloznacznym jako obiekt path.

// 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>;
}

Żądanie

Zmienna request jest dostarczana w warunku reprezentującym dla żądania wysyłanego na tę ścieżkę. Zmienna request zawiera kilka wartości właściwości, które pozwalają zdecydować, czy zezwolić na przychodzące żądanie.

Właściwości

auth

Gdy uwierzytelniony użytkownik wysyła żądanie do Cloud Storage, zmienna auth jest zapełniana wartością uid użytkownika (request.auth.uid) jako oraz deklaracji tokena JWT Firebase Authentication (request.auth.token).

request.auth.token zawiera niektóre lub wszystkie z tych kluczy:

Pole Opis
email Adres e-mail powiązany z kontem (jeśli istnieje).
email_verified true, jeśli użytkownik potwierdził, że ma dostęp do adresu email. Niektórzy dostawcy automatycznie potwierdzają swoje adresy e-mail.
phone_number Numer telefonu powiązany z kontem (jeśli istnieje).
name Wyświetlana nazwa użytkownika (jeśli została ustawiona).
sub Identyfikator UID Firebase użytkownika. Jest to unikalna wartość w obrębie projektu.
firebase.identities Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Słownik może zawierać te klucze: email, phone, google.com, facebook.com, github.com, twitter.com. Wartościami słownika są tablice unikalnych identyfikatorów każdego dostawcy tożsamości powiązanego z kontem. Na przykład auth.token.firebase.identities["google.com"][0] zawiera pierwszy identyfikator użytkownika Google powiązany z kontem.
firebase.sign_in_provider Dostawca logowania, który został użyty do uzyskania tego tokena. Może to być jeden z tych ciągów: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Identyfikator najemcy powiązany z kontem, jeśli istnieje. np. tenant2-m6tyz

Jeśli używasz uwierzytelniania niestandardowego, request.auth.token zawiera też wszelkie niestandardowe określone przez programistę.

Gdy nieuwierzytelniony użytkownik wykonuje żądanie, request.auth ma wartość null.

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

path

Zmienna path zawiera ścieżkę, w ramach której wykonywana jest czynność request przeciwko Google.

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

resource

Zmienna resource zawiera metadane przesyłanego pliku lub Zaktualizowane metadane istniejącego pliku. Jest to związane z Zmienna resource, która zawiera metadane bieżącego pliku w lokalizacji żądanej ścieżki, a nie nowych metadanych.

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

request.resource zawiera te właściwości z resource:

Właściwość
name
bucket
metadata
size
contentType

time

Zmienna time zawiera sygnaturę czasową reprezentującą bieżący czas serwera jest obecnie sprawdzane. Możesz użyć tej opcji, aby zapewnić dostęp na podstawie czasu do plików, na przykład przez zezwolenie na przesyłanie plików tylko do określonej daty, albo zezwolić na odczytywanie plików tylko do godziny od ich przesłania.

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

Dostępnych jest wiele funkcji do pisania reguł z wykorzystaniem sygnałów czasowych i czas trwania.

Zasób

Zmienna resource zawiera metadane plików w zakresie Cloud Storage, takie jak nazwa pliku, rozmiar, czas utworzenia lub niestandardowe metadane.

Właściwości

name

Ciąg tekstowy zawierający pełną nazwę pliku wraz ze ścieżką do niego.

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

bucket

Ciąg tekstowy zawierający Google Cloud Storage i zasobnikach, w których jest przechowywany ten plik.

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

generation

Int zawierający Google Cloud Storage generowanie obiektów plik. Służy do obsługi wersji obiektów.

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

metageneration

Int zawierający Google Cloud Storage metagenerowanie obiektu pliku. Służy do obsługi wersji obiektów.

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

size

Liczba całkowita zawierająca rozmiar pliku w bajtach.

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

timeCreated

Sygnatura czasowa określająca czas utworzenia pliku.

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

updated

Sygnatura czasowa określająca czas ostatniej aktualizacji pliku.

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

md5Hash

Ciąg tekstowy zawierający skrót MD5 funkcji .

// 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

Ciąg zawierający znak hasz crc32c .

// 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

Ciąg tekstowy zawierający etag elementu .

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

contentDisposition

Ciąg tekstowy zawierający dyspozycję treści pliku.

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

contentEncoding

Ciąg tekstowy zawierający kodowanie treści pliku.

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

contentLanguage

Ciąg tekstowy zawierający język treści pliku.

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

contentType

Ciąg tekstowy zawierający typ treści pliku.

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

metadata

Map<String, String> zawierający dodatkowe metadane podane przez dewelopera .

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

Firestore.get i Firestore.exists

Funkcje firestore.get() i firestore.exists() umożliwiają dostęp do dokumentów w Cloud Firestore, aby ocenić złożone kryteria autoryzacji.

Funkcje firestore.get() i firestore.exists() wymagają w pełni określone ścieżki dokumentów. Gdy używasz zmiennych do budowania ścieżek dla firestore.get() i firestore.exists(), musisz wyraźnie zmienić znaczenie zmiennych korzystających ze składni $(variable).

Firestore.get

Pobierz zawartość dokumentu Cloud Firestore.

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
    }
  }
}

straż pożarna.istnieje

Sprawdź, czy dokument Cloud Firestore istnieje.

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))
    }
  }
}

Usługa

service to pierwsza deklaracja w pliku Cloud Storage Security Rules, określa usługę, do której będą stosowane te reguły.

Nazwa

name

Reguły usługi będą miały zastosowanie. Jedyna aktualna wartość to firebase.storage

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

Typy danych

W języku Rules możesz sprawdzać typ za pomocą operatora is.

// For example
a is null
a is string

null

Typ danych null reprezentuje wartość, która nie istnieje.

allow read: if request.auth != null;

bool

Typ bool reprezentuje wartość logiczną true lub false.

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

Porównanie

Wartości logiczne można porównywać za pomocą operatorów == !=.

Operacje logiczne

Operacja Wyrażenie
AND x && y
OR x || y
NOT !x

Działanie zwiera się i może zwrócić true, false lub Błąd.

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

int i float

Typy int i float przedstawiają liczby. Ciąg znaków: 0, 1, -2 itp. , natomiast liczby zmiennoprzecinkowe to 1.0, -2.0, 3.33 itd.

Liczba całkowita to wartości 64-bitowe ze znakiem, a ułamki zmiennoprzecinkowe to wartości zgodne ze standardem IEEE 754. Podczas użycia w porównaniach wartości typu int zostaną przekształcone na float operacje arytmetyczne z wartością float,

Porównanie

Liczby całkowite i zmiennoprzecinkowe można porównywać i porządkować za pomocą tagów ==, !=, >, <, Operatory >= i <=.

Arytmetyczne

Liczba całkowita i liczba zmiennoprzecinkowa można dodawać, odejmować, mnożyć, dzielić, modulować i negacja:

Operacja Wyrażenie
Dodane x + y
Odejmowanie x - y
Mnożenie x * y
Podział x / y
Modulo x % y
Negacja -x

Funkcje matematyczne

Funkcja Firebase Security Rules w języku Cloud Storage zapewnia też szereg funkcji pomocnych w matematyce funkcje do upraszczania wyrażeń:

Funkcja Opis
math.ceil(x) Góra wartości liczbowej
math.floor(x) Dolny poziom wartości liczbowej
math.round(x) Zaokrąglaj wartość wejściową do najbliższej liczby całkowitej
math.abs(x) Wartość bezwzględna danych wejściowych
math.isInfinite(x) Testuj, czy wartość to ±∞, zwraca bool
math.isNaN(x) Sprawdź, czy wartość nie jest liczbą NaN, zwraca bool

string

Porównanie

Ciągi można porównywać i porządkować leksograficznie za pomocą funkcji ==, !=, >, <, >= oraz <=.

Łączenie

Ciągi znaków można łączyć za pomocą operatora +.

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

Indeks i zakres

Operator index (string[]) zwraca ciąg znaków zawierający znak dla podanego indeksu w ciągu znaków.

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

Operator range (string[i:j]) zwraca ciąg znaków zawierający znaków między określonymi indeksami, od i (włącznie) do j (wyłącznie). Jeśli nie określono i lub j, domyślnie przyjmuje się wartość 0 oraz rozmiar ciąg znaków, ale musi być określone co najmniej i lub j. , aby zakres był prawidłowy.

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

Operatory index i range zwracają błąd, jeśli podane indeksy są prawidłowe. przekracza granice ciągu znaków.

size

Zwraca liczbę znaków ciągu.

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

matches

Wykonuje dopasowanie do wyrażenia regularnego i zwraca true, jeśli ciąg znaków pasuje do dla danego wyrażenia regularnego. Zastosowania składni Google RE2.

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

split

Dzieli ciąg znaków zgodnie z podanym wyrażeniem regularnym i zwraca list ciągów tekstowych. Używa składni Google RE2.

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

path

Ścieżki to nazwy przypominające katalogi z opcjonalnym dopasowywaniem wzorców. ukośnik prawy / wskazuje początek segmentu ścieżki.

path

Konwertuje argument string na path.

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

timestamp

Sygnatury czasowe są podane w czasie UTC, a możliwe wartości zaczynają się od 0001-01-01T00.00.00Z z numerem 9999-12-31T23.59.59Z.

Porównanie

Sygnatury czasowe można porównywać i porządkować za pomocą tagów ==, !=, >, <, >= <=.

Arytmetyczne

Sygnatury czasowe umożliwiają dodawanie i odejmowanie między sygnaturami czasowymi i czasem trwania następujące:

Wyrażenie Wynik
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

date

Wartość timestamp zawierająca tylko wartości year, month i day.

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

year

Wartość roku jako liczba całkowita z zakresu od 1 do 9999.

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

month

Wartość miesiąca jako liczba całkowita z zakresu od 1 do 12.

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

day

Bieżący dzień miesiąca w postaci liczby całkowitej z zakresu od 1 do 31.

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

time

Wartość duration zawierająca bieżący czas.

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

hours

Wartość godziny jako liczba całkowita od 0 do 23.

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

minutes

Wartość minut jako liczba całkowita od 0 do 59.

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

seconds

Wartość w sekundach jako liczba całkowita z zakresu od 0 do 59.

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

nanos

Ułamkowe sekundy w nanos w postaci liczby całkowitej.

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

dayOfWeek

Dzień tygodnia, od 1 (poniedziałek) do 7 (niedziela).

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

dayOfYear

Dzień bieżącego roku, od 1 do 366.

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

toMillis

Zwraca bieżącą liczbę milisekund od początku epoki uniksowej.

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

duration

Czas trwania jest wyrażony w sekundach i ułamkowych sekundach w nanosekund.

Porównanie

Czasy trwania można porównywać i porządkować za pomocą właściwości ==, !=, >, <, >= oraz <=.

Arytmetyczne

Czasy trwania obsługują dodawanie i odejmowanie między sygnaturami czasowymi i czasem trwania jako następujące:

Wyrażenie Wynik
timestamp + duration timestamp
duration + timestamp timestamp
timestamp - duration timestamp
timestamp - timestamp duration
duration + duration duration
duration - duration duration

seconds

Liczba sekund bieżącego czasu trwania. Musi mieścić się w przedziale -315 576 000 000 i ponad 315 576 000 000 włącznie.

nanos

Liczba sekund (w nanosekundach) ułamka bieżącego czasu. Musi między -999 999 999 a +999 999 999 włącznie. W przypadku sekund różnej od zera oraz nanosekund o wartości innej niż zero, znaki muszą się zgadzać.

duration.value

Czasy trwania można tworzyć za pomocą funkcji duration.value(int magnitude, string units) , która tworzy czas trwania na podstawie podanej jednostki i wielkości.

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

Możliwe elementy unit to:

Czas trwania unit
Tygodnie w
Dni d
Godziny h
Minuty m
Sekundy s
Milisekundy ms
Nanosekundy ns

duration.time

Czasy trwania można tworzyć za pomocą funkcji duration.time(int hours, int minutes, int seconds, int nanoseconds), który tworzy czas trwania danych godzin, minut, sekund nanosekund.

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

list

Lista zawiera uporządkowaną tablicę wartości, które mogą być typu: null, bool, int, float, string, path, list, map, timestamp lub duration.

Uwzględnione są x i y typu list i i oraz j typu int

Stworzenie

Aby utworzyć listę, umieść wartości w nawiasach:

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

Porównanie

Listy można porównywać za pomocą operatorów == !=. Równość dwóch list wymaga, aby wszystkie wartości były równe.

Indeks i zakres

Operator index (list[]) zwraca element o podanym indeksie w funkcji z listy.

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

Operator range (list[i:j]) zwraca wszystkie elementy listy pomiędzy określone indeksy od i (włącznie) do j (bez uwzględniania). Jeśli i lub j mają wartość nie jest określony, domyślnie przyjmuje się wartość 0 i rozmiar listy, ale aby zakres był prawidłowy, należy określić co najmniej i lub j.

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

in

Zwraca true, jeśli żądana wartość znajduje się na liście, lub false, jeśli nie ma tej wartości obecnie.

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

join

Łączy listę ciągów znaków w jeden ciąg tekstowy rozdzielony danym ciągiem znaków.

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

size

Liczba elementów na liście.

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

hasAll

Zwraca true, jeśli na liście znajdują się wszystkie wartości.

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

map

Mapa zawiera pary klucz/wartość, gdzie klucze to ciągi znaków, a wartości mogą być dowolnymi z: null, bool, int, float, string, path, list, map, timestamp lub duration.

Stworzenie

Aby utworzyć mapę, dodaj pary klucz-wartość między nawiasami klamrowymi:

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

Porównanie

Mapy można porównywać za pomocą == operatorów !=. Równość dwóch map wymaga, aby wszystkie klucze były obecne zarówno w mapach, jak i wszystkie wartości są takie same.

Indeks

Dostęp do wartości na mapie możesz uzyskać, używając nawiasów lub kropek:

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

Jeśli klucz nie będzie używany, zostanie zwrócony element error.

in

Zwraca true, jeśli żądany klucz znajduje się na mapie, lub false, jeśli nie ma go obecnie.

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

size

Liczba klawiszy na mapie.

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

keys

Lista wszystkich klawiszy na mapie.

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

values

Lista wszystkich wartości na mapie w kolejności kluczy.

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

Błędy

Ocena błędów

Firebase Security Rules dla Cloud Storage kontynuuj ocenę po wystąpieniu błędów. Jest to przydatne, ponieważ wyrażenia warunkowe && i || mogą wychwytywać błąd jeśli warunek warunkowy spowoduje zwarcie do false lub true . Przykład:

Wyrażenie Wynik
error && true error
error && false false
error || true true
error || false error

Najczęstsze miejsca występowania błędów: dzielenie przez zero, dostęp do wartości na liście lub mapie, które nie istnieją, oraz przekazywane wartości nieprawidłowego typu do funkcji.

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