Dateien sichern

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.