Cloud Storage for Firebase udostępnia deklaratywny model zabezpieczeń oparty na ścieżce o nazwie Firebase Security Rules dla usługi Cloud Storage, która umożliwia szybkie i łatwe i zabezpieczyć pliki.
Zrozumienie reguł
Firebase Security Rules w domenie Cloud Storage są używane do określania, kto odczytywał i zapisywał dane
dostępu do plików przechowywanych w usłudze Cloud Storage oraz sposobu ich przechowywania
uporządkowanych i zawartych w nich metadanych. Podstawowym typem reguły jest allow
która zezwala na żądania read
i write
, jeśli zostało określone opcjonalnie
określony jest warunek, na przykład:
// If no condition is specified, the rule evaluates to true allow read; // Rules can optionally specify a condition allow write: if <condition>; // Rules can also specify multiple request methods allow read, write: if <condition>;
Pasujące ścieżki
Cloud Storage Security Rules match
ścieżki do plików używane do uzyskiwania dostępu do plików w
Cloud Storage Reguły mogą match
ścieżki ścisłe lub ścieżki z symbolami wieloznacznymi.
również mogą być zagnieżdżone. Jeśli żadna reguła dopasowania nie zezwala na określoną metodę żądania lub
ma wartość false
, żądanie jest odrzucane.
Dopasowania ścisłe
// Exact match for "images/profilePhoto.png" match /images/profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /images/croppedProfilePhoto.png { allow write: if <other_condition>; }
Zagnieżdżone dopasowania
// Partial match for files that start with "images" match /images { // Exact match for "images/profilePhoto.png" match /profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /croppedProfilePhoto.png { allow write: if <other_condition>; } }
Dopasowania symboli wieloznacznych
Reguł można też używać do match
wzorca za pomocą symboli wieloznacznych. Symbol wieloznaczny to
nazwana zmienna reprezentująca pojedynczy ciąg, taki jak
profilePhoto.png
lub wiele segmentów ścieżki, np.
images/profilePhoto.png
Symbol wieloznaczny tworzy się przez dodanie nawiasów klamrowych wokół nazwy, np.
{string}
Symbol wieloznaczny dla wielu segmentów można zadeklarować, dodając =**
do
nazwa symbolu wieloznacznego, np. {path=**}
:
// Partial match for files that start with "images" match /images { // Exact match for "images/*" // e.g. images/profilePhoto.png is matched match /{imageId} { // This rule only matches a single path segment (*) // imageId is a string that contains the specific segment matched allow read: if <condition>; } // Exact match for "images/**" // e.g. images/users/user:12345/profilePhoto.png is matched // images/profilePhoto.png is also matched! match /{allImages=**} { // This rule matches one or more path segments (**) // allImages is a path that contains all segments matched allow read: if <other_condition>; } }
Jeśli do pliku pasuje wiele reguł, wynik to OR
wszystkich reguł
weryfikacji reguł. Oznacza to, że jeśli dowolna reguła pasująca do pliku zwraca wartość true
,
wynik to true
.
W regułach powyżej plik „images/profilePhoto.png” można odczytać, jeśli:
condition
lub other_condition
zwracają wartość prawda, a plik
„images/users/user:12345/profilePhoto.png” zależy jedynie od wyniku
other_condition
Do zmiennej z symbolem wieloznacznym można się odwoływać z pliku udostępniania match
autoryzacja nazwy lub ścieżki:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules nie są kaskadowe, a reguły są oceniane tylko wtedy, gdy Ścieżka żądania pasuje do ścieżki z określonymi regułami.
Poproś o ocenę
Przesłane, pobrane, zmiany w metadanych i usunięcie są oceniane na podstawie
Wysłano request
do: Cloud Storage. Zmienna request
zawiera
ścieżka pliku, w której jest wykonywane żądanie, czas wykonania żądania
oraz nową wartość resource
, jeśli żądanie dotyczyło zapisu. Nagłówki HTTP
i stan uwierzytelniania.
Obiekt request
zawiera też unikalny identyfikator użytkownika i obiekt
ładunek Firebase Authentication w obiekcie request.auth
, który zostanie
wyjaśniono dokładniej w sekcji Bezpieczeństwo oparte na użytkownikach
sekcji dokumentów.
Pełną listę właściwości obiektu request
znajdziesz poniżej:
Właściwość | Typ | Opis |
---|---|---|
auth |
mapa<ciąg, ciąg> | Gdy użytkownik jest zalogowany, podaje uid , jego unikalny identyfikator oraz
token , mapa deklaracji JWT (Firebase Authentication). W przeciwnym razie zostanie
null |
params |
mapa<ciąg, ciąg> | Mapa zawierająca parametry zapytania żądania. |
path |
ścieżka | path reprezentujący ścieżkę, do której prowadzi żądanie
wykonano na |
resource |
mapa<ciąg, ciąg> | Nowa wartość zasobu, obecna tylko w żądaniach write .
|
time |
sygnatura czasowa | Sygnatura czasowa określająca czas oceny żądania przez serwer. |
Ocena zasobów
Oceniając reguły, warto też przeanalizować metadane pliku przesyłania, pobierania, modyfikowania lub usuwania. Dzięki temu możesz tworzyć złożone i skuteczne reguły, które zezwalają na używanie tylko plików o określonych parametrach. typów treści, które mają być przesyłane, lub tylko pliki większe niż określony rozmiar Usunięto.
Parametr Firebase Security Rules dla Cloud Storage zawiera metadane pliku w tagu resource
który zawiera pary klucz-wartość metadanych wyświetlanych w tagu
Cloud Storage obiekt. Te właściwości można sprawdzać w: read
lub
write
żądania, aby zapewnić integralność danych.
W przypadku żądań write
(takich jak przesłanie, aktualizacja lub usunięcie metadanych) w
oprócz obiektu resource
, który zawiera metadane pliku
który obecnie znajduje się na ścieżce żądania, możesz również użyć funkcji
Obiekt request.resource
, który zawiera podzbiór metadanych pliku
jeśli dozwolony jest zapis. Korzystając z tych 2 wartości, możesz zapewnić dane
integralności lub egzekwować ograniczenia aplikacji, takie jak typ lub rozmiar pliku.
Pełną listę właściwości obiektu resource
znajdziesz poniżej:
Właściwość | Typ | Opis |
---|---|---|
name |
ciąg znaków | Pełna nazwa obiektu. |
bucket |
ciąg znaków | Nazwa zasobnika, w którym znajduje się ten obiekt. |
generation |
int, | GCS generowania obiektu. |
metageneration |
int, | GCS przez metagenerację tego obiektu. |
size |
int, | Rozmiar obiektu w bajtach. |
timeCreated |
sygnatura czasowa | Sygnatura czasowa określająca czas utworzenia obiektu. |
updated |
sygnatura czasowa | Sygnatura czasowa określająca czas ostatniej aktualizacji obiektu. |
md5Hash |
ciąg znaków | Skrót MD5 obiektu. |
crc32c |
ciąg znaków | Skrót crc32c obiektu. |
etag |
ciąg znaków | ETag powiązany z tym obiektem. |
contentDisposition |
ciąg znaków | Dyspozycja treści powiązana z tym obiektem. |
contentEncoding |
ciąg znaków | Kodowanie treści powiązane z tym obiektem. |
contentLanguage |
ciąg znaków | Język treści powiązany z tym obiektem. |
contentType |
ciąg znaków | Typ treści powiązany z tym obiektem. |
metadata |
mapa<ciąg, ciąg> | Pary klucz-wartość dodatkowych metadanych niestandardowych określonych przez dewelopera. |
request.resource
zawiera wszystkie te elementy z wyjątkiem generation
,
metageneration
, etag
, timeCreated
i updated
.
Pełny przykład
Gdy to zrobisz, możesz utworzyć przykłady reguł dla obrazu rozwiązanie do przechowywania danych:
service firebase.storage { match /b/{bucket}/o { match /images { // Cascade read to any image type at any path match /{allImages=**} { allow read; } // Allow write files to the path "images/*", subject to the constraints: // 1) File is less than 5MB // 2) Content type is an image // 3) Uploaded content type matches existing content type (if it exists) // 4) File name (stored in imageId wildcard variable) is less than 32 characters match /{imageId} { allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*') && (resource == null || request.resource.contentType == resource.contentType) && imageId.size() < 32 } } } }
Zintegrujmy teraz usługę Firebase Authentication, aby umożliwić szczegółowy dostęp do plików dla poszczególnych użytkowników sekcję Bezpieczeństwo użytkowników.