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