Reguły bezpieczeństwa Firebase dotyczące przechowywania w chmurze — odniesienie

Reguły bezpieczeństwa Firebase dla Cloud Storage służą do określenia, kto ma dostęp do odczytu i zapisu plików przechowywanych w Cloud Storage, a także do określenia struktury plików i zawartych w nich metadanych. Reguły bezpieczeństwa Cloud Storage składają się z reguł, które uwzględniają request i resource , aby umożliwić lub odmówić żądanej akcji, takiej jak przesłanie pliku lub pobranie metadanych pliku. Te dokumenty referencyjne omawiają typy reguł, właściwości request i resource , typy danych używane przez reguły zabezpieczeń Cloud Storage oraz sposoby występowania błędów.

Reguła

rule to wyrażenie oceniane w celu ustalenia, czy request może wykonać żądaną akcję.

Typy

Umożliwić

reguły allow składają się z metody takiej jak read lub write oraz opcjonalnego warunku. Po wykonaniu reguły oceniany jest warunek i jeśli warunek ma wartość true , dozwolona jest żądana metoda; w przeciwnym razie metoda zostanie odrzucona. Reguła allow bez warunku zawsze zezwala na żądaną metodę.

// Always allow method
allow <method>;

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

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

Metody żądania

Czytać

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

// Always allow reads
allow read;

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

Pisać

Metoda write obejmuje wszystkie żądania, w których zapisywane są dane pliku lub metadane, w tym przesyłanie plików, usuwanie plików i aktualizacje metadanych plików.

// Always allow writes
allow write;

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

Mecz

Reguły są wykonywane, gdy request użytkownika (takie jak przesłanie lub pobranie pliku) pasuje do ścieżki pliku objętej regułą. match składa się ze ścieżki i treści, która musi zawierać co najmniej jedną regułę allow . Jeśli żadna ścieżka nie zostanie dopasowana, żądanie zostanie odrzucone.

Można match pełną nazwę ścieżki lub wstawić symbole wieloznaczne, aby dopasować wszystkie ścieżki pasujące do określonego wzorca.

Segmenty ścieżki

single_segment

Możesz użyć pojedynczych segmentów ścieżki, aby utworzyć regułę pasującą do pliku przechowywanego w Cloud Storage.

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

Dopuszczalnych jest także wiele segmentów ścieżki 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ć segmentu ścieżki z symbolem wieloznacznym, aby dopasować wszystkie pliki w określonej ścieżce. Zmienna wieloznaczna jest deklarowana w ścieżce poprzez zawijanie zmiennej w nawiasy klamrowe: {variable} . Ta zmienna jest dostępna w instrukcji match 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>;
}

Wiele segmentów ścieżki i ścieżek zagnieżdżonych może również 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ć wielosegmentowego symbolu wieloznacznego, który dopasuje wszystkie żądania do i poniżej lokalizacji. Może to być przydatne do zapewnienia użytkownikowi własnej, dowolnej przestrzeni dyskowej lub do tworzenia reguł pasujących do wielu różnych segmentów ścieżki (takich jak tworzenie publicznie czytelnego zestawu plików lub wymaganie uwierzytelniania wszystkich zapisów).

Wielosegmentową ścieżkę z symbolem wieloznacznym deklaruje się podobnie do jednosegmentowego znaku wieloznacznego, z dodatkiem =** na końcu zmiennej: {variable=**} . W instrukcji match dostępna jest wielosegmentowa zmienna wieloznaczna 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>;
}

Wniosek

Zmienna request jest dostarczana w warunku reprezentującym żądanie wysyłane w tej ścieżce. Zmienna request ma wiele właściwości, za pomocą których można zdecydować, czy zezwolić na przychodzące żądanie.

Nieruchomości

auth

Gdy uwierzytelniony użytkownik wysyła żądanie do Cloud Storage, zmienna auth jest wypełniana uid użytkownika użytkownika ( request.auth.uid ), a także oświadczeniami tokenu JWT uwierzytelniania Firebase ( request.auth.token ).

request.auth.token zawiera niektóre lub wszystkie z następujących 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 weryfikują posiadane adresy e-mail.
phone_number Numer telefonu powiązany z kontem, jeśli jest obecny.
name Nazwa wyświetlana użytkownika, jeśli jest ustawiona.
sub Identyfikator UID Firebase użytkownika. Jest to unikalne rozwiązanie w ramach projektu.
firebase.identities Słownik wszystkich tożsamości powiązanych z kontem tego użytkownika. Kluczami słownika mogą być dowolne z następujących: email , phone , google.com , facebook.com , github.com , twitter.com . Wartości słownika to tablice unikalnych identyfikatorów dla 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 używany do uzyskania tego tokenu. Może to być jeden z następujących 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

W przypadku korzystania z uwierzytelniania niestandardowego request.auth.token zawiera również wszelkie niestandardowe oświadczenia określone przez dewelopera.

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ę, względem której wykonywane jest request .

// 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 powiązane ze zmienną resource , która zawiera metadane bieżącego pliku w żądanej ścieżce, w przeciwieństwie do 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 następujące właściwości z resource :

Nieruchomość
name
bucket
metadata
size
contentType

time

Zmienna time zawiera znacznik czasu reprezentujący bieżący czas serwera, w którym oceniane jest żądanie. Możesz użyć tej opcji, aby zapewnić dostęp do plików na podstawie czasu, na przykład zezwalając na przesyłanie plików tylko do określonej daty lub zezwalając na odczytywanie plików tylko do godziny po ich przesłaniu.

// 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 umożliwiających pisanie reguł przy użyciu znaczników czasu i czasów trwania .

Ratunek

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

Nieruchomości

name

Ciąg zawierający pełną nazwę pliku, łącznie ze ścieżką do pliku.

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

bucket

Ciąg znaków zawierający zasobnik Google Cloud Storage, w którym przechowywany jest ten plik.

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

generation

Wartość int zawierająca generowanie obiektu Google Cloud Storage w pliku. Używany do wersjonowania obiektów.

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

metageneration

Wartość int zawierająca metagenerację pliku obiektu Google Cloud Storage. Używany do wersjonowania obiektów.

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

size

Liczba typu int 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 reprezentująca datę 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

Znacznik czasu reprezentujący datę 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 zawierający skrót MD5 pliku.

// 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 skrót crc32c pliku.

// 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 zawierający etag pliku.

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

contentDisposition

Ciąg zawierający dyspozycję zawartości pliku.

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

contentEncoding

Ciąg zawierający kodowanie zawartości pliku.

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

contentLanguage

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

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

contentType

Ciąg zawierający typ zawartości pliku.

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

metadata

Map<String, String> zawierający dodatkowe pola metadanych dostarczone 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 w celu oceny złożonych kryteriów autoryzacji.

Funkcje firestore.get() i firestore.exists() wymagają w pełni określonych ścieżek dokumentów. Używając zmiennych do konstruowania ścieżek dla firestore.get() i firestore.exists() , musisz jawnie uciec od zmiennych, używając 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
    }
  }
}

Firestore.istnieje

Sprawdź, czy istnieje dokument Cloud Firestore.

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

Praca

service jest pierwszą deklaracją w pliku reguł zabezpieczeń Cloud Storage i określa, do której usługi będą miały zastosowanie te reguły.

Nazwa

name

Nazwa regulaminu usługi będzie miała zastosowanie. Jedyną aktualną wartością jest firebase.storage .

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

Typy danych

Język Reguły umożliwia sprawdzenie typu 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ą typu 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

Operacje powodują zwarcie i mogą zwrócić wartość true , false lub Error .

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 reprezentują liczby. Int to: 0 , 1 , -2 itd., natomiast float to: 1.0 , -2.0 , 3.33 itd.

Int to wartości 64-bitowe ze znakiem, a liczby zmiennoprzecinkowe to 64-bitowe wartości zgodne ze standardem IEEE 754. Wartości typu int będą wymuszane na wartości float , jeśli zostaną użyte w porównaniach i operacjach arytmetycznych z wartością float .

Porównanie

Wartości typu int i float można porównywać i porządkować za pomocą operatorów == , != , > , < , >= i <= .

Arytmetyka

Liczby całkowite i zmiennoprzecinkowe można dodawać, odejmować, mnożyć, dzielić, modulować i negować:

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

Funkcje matematyczne

Reguły bezpieczeństwa Firebase dla Cloud Storage udostępniają także szereg funkcji pomocniczych matematycznych upraszczających wyrażenia:

Funkcjonować Opis
math.ceil(x) Pułap wartości liczbowej
math.floor(x) Podłoga wartości liczbowej
math.round(x) Zaokrąglij wartość wejściową do najbliższej liczby całkowitej
math.abs(x) Wartość bezwzględna wejścia
math.isInfinite(x) Sprawdź, czy wartość wynosi ±∞ , 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ć leksykalnie, używając operatorów == , != , > , < , >= i <= .

Powiązanie

Ciągi 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 o podanym indeksie w ciągu.

// 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 znaki pomiędzy określonymi indeksami, od i (włącznie) do j (wyłącznie). Jeśli i lub j nie są określone, domyślnie przyjmują odpowiednio 0 i rozmiar łańcucha, ale aby zakres był prawidłowy, należy określić przynajmniej i lub j .

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

Operatory index i range zwrócą błąd, jeśli podane indeksy przekraczają granice ciągów.

size

Zwraca liczbę znaków w ciągu.

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

matches

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

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

split

Dzieli ciąg zgodnie z podanym wyrażeniem regularnym i zwraca list ciągów. 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 dopasowaniem wzorca. Obecność ukośnika / oznacza 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 podano w formacie UTC, a możliwe wartości zaczynają się od 0001-01-01T00.00.00Z i kończą na 9999-12-31T23.59.59Z.

Porównanie

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

Arytmetyka

Znaczniki czasu obsługują dodawanie i odejmowanie między znacznikami czasu i czasem trwania w następujący sposób:

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 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 typu int, 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 jako liczba całkowita, 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ść godzin jako liczba całkowita z zakresu 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ść sekund jako liczba całkowita, od 0 do 59.

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

nanos

Ułamki sekund w nano jako liczba całkowita.

// 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 epoki Uniksa.

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

duration

Wartości czasu trwania są przedstawiane jako sekundy plus ułamki sekund w nanosekundach.

Porównanie

Czasy trwania można porównywać i porządkować za pomocą operatorów == , != , > , < , >= i <= .

Arytmetyka

Czasy trwania obsługują dodawanie i odejmowanie między znacznikami czasu i czasami trwania w następujący sposób:

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 od -315 576 000 000 do +315 576 000 000 włącznie.

nanos

Liczba ułamków sekund (w nanosekundach) bieżącego czasu trwania. Musi mieścić się w przedziale od -999 999 999 do +999 999 999 włącznie. W przypadku niezerowych sekund i niezerowych nanosekund znaki obu 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 wielkości i jednostki.

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

Możliwe 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óra tworzy czas trwania danych godzin, minut, sekund i 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 .

Biorąc pod uwagę x i y typu list oraz i i j typu int

kreacja

Aby utworzyć listę, dodaj 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 pod podanym indeksem na liście.

// 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ślonymi indeksami, od i (włącznie) do j (wyłącznie). Jeśli i lub j nie są określone, domyślnie przyjmują one odpowiednio 0 i rozmiar listy, ale aby zakres był prawidłowy, należy określić przynajmniej 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 jej nie ma.

// 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 w jeden ciąg, oddzielony podanym ciągiem.

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

size

Liczba pozycji 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 są ciągami znaków, a wartościami mogą być dowolne spośród: null , bool , int , float , string , path , list , map , timestamp lub duration .

kreacja

Aby utworzyć mapę, dodaj pary klucz/wartość w nawiasach klamrowych:

// 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 na obu mapach i wszystkie wartości były równe.

Indeks

Dostęp do wartości na mapie można uzyskać za pomocą nawiasu lub kropki:

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

Jeśli klucz nie jest obecny, zostanie zwrócony error .

in

Zwraca true , jeśli żądany klucz występuje na mapie, lub false , jeśli nie jest obecny.

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

size

Liczba kluczy na mapie.

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

keys

Lista wszystkich kluczy 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 kluczowej.

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

Błędy

Ocena błędu

Reguły bezpieczeństwa Firebase dla Cloud Storage kontynuują ocenę w przypadku napotkania błędów. Jest to przydatne, ponieważ warunkowe && i || wyrażenia mogą absorbować błąd, jeśli w przeciwnym razie warunek spowodowałby zwarcie odpowiednio do false lub true . Na przykład:

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

Najczęstsze miejsca, w których zgłaszane są błędy, to: dzielenie przez zero, uzyskiwanie dostępu do wartości na liście lub mapie, które nie istnieją oraz przekazywanie 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');