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