Cloud Storage for Firebase bietet ein deklaratives pfadbasiertes Sicherheitsmodell namens Firebase Security Rules für Cloud Storage. Damit können Sie zum Schutz Ihrer Dateien.
Regeln verstehen
Firebase Security Rules für Cloud Storage wird verwendet, um zu bestimmen, wer Lese- und Schreibzugriff hat
Zugriff auf Dateien, die in Cloud Storage gespeichert sind, und wie Dateien gespeichert werden
strukturiert und welche Metadaten sie enthalten. Der grundlegende Regeltyp ist der allow
die read
- und write
-Anfragen zulässt, wenn optional
Bedingung angegeben ist. Beispiel:
// 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>;
Übereinstimmende Pfade
Cloud Storage Security Rules match
: die Dateipfade, die für den Zugriff auf Dateien verwendet werden
Cloud Storage Regeln können exakte Pfade oder Platzhalterpfade match
und
Regeln können auch verschachtelt sein. Wenn keine Übereinstimmungsregel eine Anfragemethode zulässt oder der
Bedingung false
ergibt, wird die Anfrage abgelehnt.
Genaue Übereinstimmungen
// 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>; }
Verschachtelte Übereinstimmungen
// 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>; } }
Platzhalterübereinstimmungen
Mithilfe von Regeln können Sie auch ein Muster mit Platzhaltern match
. Ein Platzhalter ist ein
benannte Variable, die entweder einen einzelnen String wie
profilePhoto.png
oder mehrere Pfadsegmente, z. B.
images/profilePhoto.png
.
Platzhalter werden durch geschweifte Klammern um den Platzhalternamen herum erstellt, z. B. {string}
. Ein Platzhalter für mehrere Segmente kann angegeben werden, indem =**
zum
Platzhaltername wie {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>; } }
Wenn mehrere Regeln mit einer Datei übereinstimmen, ist das Ergebnis die OR
der Ergebnisse aller
für die Auswertung von Regeln. Das heißt, wenn eine Regel, mit der die Datei übereinstimmt, true
ergibt,
Ergebnis ist true
.
In den obigen Regeln wird die Datei „images/profilePhoto.png“ gelesen werden können, wenn
condition
oder other_condition
werden als „true“ ausgewertet,
"images/users/user:12345/profilePhoto.png" unterliegt nur dem Ergebnis einer
other_condition
.
Eine Platzhaltervariable kann innerhalb der match
-Anweisung für die Dateinamen- oder Pfadautorisierung referenziert werden:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules werden nicht kaskadiert und Regeln werden nur ausgewertet, wenn die Anfragepfad stimmt mit einem Pfad mit angegebenen Regeln überein.
Bewertung anfordern
Uploads, Downloads, Metadatenänderungen und Löschvorgänge werden mithilfe der
request
an Cloud Storage gesendet. Die Variable request
enthält den Parameter
Dateipfad, unter dem die Anfrage ausgeführt wird, also den Zeitpunkt, an dem die Anfrage ausgeführt wird
und den neuen resource
-Wert, wenn die Anfrage ein Schreibvorgang ist. HTTP-Header
Authentifizierungsstatus
und Authentifizierungsstatus angegeben.
Das request
-Objekt enthält außerdem die eindeutige ID des Nutzers und den
Firebase Authentication-Nutzlast im request.auth
-Objekt, die
der im Abschnitt Nutzerbasierte Sicherheit näher erläutert wird.
der Dokumentation.
Eine vollständige Liste der Eigenschaften im Objekt request
findest du unten:
Attribut | Typ | Beschreibung |
---|---|---|
auth |
map<string, string> | Wenn ein Nutzer angemeldet ist, gibt er uid , die eindeutige ID des Nutzers und
token , eine Zuordnung von Firebase Authentication JWT-Anforderungen. Andernfalls wird es
null |
params |
map<string, string> | Zuordnung mit den Abfrageparametern der Anfrage. |
path |
Pfad | Ein path , der den Pfad darstellt, in dem sich die Anfrage befindet
gearbeitet hat. |
resource |
map<string, string> | Der neue Ressourcenwert, der nur in write -Anfragen vorhanden ist.
|
time |
timestamp | Ein Zeitstempel, der die Serverzeit angibt, zu der die Anfrage ausgewertet wird. |
Ressourcenbewertung
Bei der Auswertung von Regeln können Sie auch die Metadaten der Datei auswerten. hochgeladen, heruntergeladen, geändert oder gelöscht werden. So können Sie die beispielsweise nur Dateien mit bestimmten auszuwählen, die hochgeladen werden sollen, oder nur Dateien, die eine bestimmte Größe überschreiten, gelöscht.
Firebase Security Rules für Cloud Storage stellt Dateimetadaten in resource
bereit
, das Schlüssel/Wert-Paare der Metadaten enthält, die in einem
Cloud Storage-Objekt. Diese Eigenschaften können unter read
oder
write
-Anfragen, um die Datenintegrität sicherzustellen.
Bei write
-Anfragen (z. B. Uploads, Metadatenaktualisierungen und Löschungen) in
Zusätzlich zum resource
-Objekt, das die Metadaten der Datei enthält
derzeit im Anfragepfad vorhanden ist, können Sie auch den
request.resource
-Objekt, das eine Teilmenge der Dateimetadaten enthält, die verwendet werden sollen.
geschrieben wird, wenn der Schreibvorgang erlaubt ist. Mit diesen beiden Werten
können Sie sicherstellen,
oder Anwendungseinschränkungen wie Dateityp oder -größe durchzusetzen.
Eine vollständige Liste der Eigenschaften im Objekt resource
findest du unten:
Attribut | Typ | Beschreibung |
---|---|---|
name |
String | Der vollständige Name des Objekts |
bucket |
String | Der Name des Buckets, in dem sich dieses Objekt befindet. |
generation |
int | Das GCS Objektgenerierung dieses Objekts. |
metageneration |
int | Das GCS Metageneration dieses Objekts. |
size |
int | Größe des Objekts in Byte. |
timeCreated |
timestamp | Ein Zeitstempel, der den Zeitpunkt angibt, zu dem ein Objekt erstellt wurde. |
updated |
timestamp | Ein Zeitstempel, der den Zeitpunkt angibt, zu dem ein Objekt zuletzt aktualisiert wurde. |
md5Hash |
String | Ein MD5-Hash des Objekts. |
crc32c |
String | CRC32C-Hash des Objekts |
etag |
String | Das mit diesem Objekt verknüpfte ETag. |
contentDisposition |
String | Die mit diesem Objekt verknüpfte Inhaltsdisposition. |
contentEncoding |
String | Die Inhaltscodierung, die mit diesem Objekt verknüpft ist. |
contentLanguage |
String | Die mit diesem Objekt verknüpfte Inhaltssprache. |
contentType |
String | Der Inhaltstyp, der mit diesem Objekt verknüpft ist. |
metadata |
Map<string, string> | Schlüssel/Wert-Paare mit zusätzlichen, vom Entwickler angegebenen benutzerdefinierten Metadaten. |
request.resource
enthält alle diese außer generation
.
metageneration
, etag
, timeCreated
und updated
.
Vollständiges Beispiel
Zusammengenommen können Sie ein vollständiges Beispiel für Regeln für eine Lösung zum Speichern von Bildern erstellen:
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 } } } }
Lassen Sie uns jetzt Firebase Authentication integrieren, um den Dateizugriff auf Nutzerebene in im Abschnitt Nutzersicherheit.