Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Verwenden Sie die Bedingungen in den Firebase Cloud Storage-Sicherheitsregeln

Dieses Handbuch baut auf dem Erlernen der Kernsyntax des Sprachhandbuchs für Firebase-Sicherheitsregeln auf und zeigt, wie Sie Ihren Firebase-Sicherheitsregeln für Cloud-Speicher Bedingungen hinzufügen.

Der Hauptbaustein der Cloud Storage-Sicherheitsregeln ist die Bedingung . Eine Bedingung ist ein boolescher Ausdruck, der bestimmt, ob eine bestimmte Operation zugelassen oder abgelehnt werden soll. Für Grundregeln funktioniert die Verwendung von true und false Literalen als Bedingungen perfekt. Mit den Firebase-Sicherheitsregeln für die Cloud-Speichersprache können Sie jedoch komplexere Bedingungen schreiben, die Folgendes ermöglichen:

  • Überprüfen Sie die Benutzerauthentifizierung
  • Eingehende Daten validieren

Authentifizierung

Die Firebase-Sicherheitsregeln für Cloud-Speicher werden in die Firebase-Authentifizierung integriert, um eine leistungsstarke benutzerbasierte Authentifizierung für Cloud-Speicher bereitzustellen. Dies ermöglicht eine detaillierte Zugriffskontrolle basierend auf den Ansprüchen eines Firebase-Authentifizierungstokens.

Wenn ein authentifizierter Benutzer eine Anforderung für Cloud Storage ausführt, wird die Variable request.auth mit der uid des Benutzers ( request.auth.uid ) sowie den Ansprüchen der Firebase-Authentifizierungs-JWT ( request.auth.token ) request.auth.token .

Darüber hinaus werden bei Verwendung der benutzerdefinierten Authentifizierung zusätzliche Ansprüche im Feld request.auth.token .

Wenn ein nicht authentifizierter Benutzer eine Anforderung ausführt, ist die Variable request.auth null .

Mit diesen Daten gibt es verschiedene Möglichkeiten, die Authentifizierung zum Sichern von Dateien zu verwenden:

  • Öffentlich: ignoriere request.auth
  • Authentifiziert privat: Überprüfen Sie, request.auth nicht null
  • Benutzer privat: Überprüfen Sie, request.auth.uid einer Pfad- uid
  • Gruppe privat: Überprüfen Sie die Ansprüche des benutzerdefinierten Tokens auf Übereinstimmung mit einem ausgewählten Anspruch oder lesen Sie die Dateimetadaten, um festzustellen, ob ein Metadatenfeld vorhanden ist

Öffentlichkeit

Jede Regel, die den Kontext request.auth nicht berücksichtigt, kann als public Regel betrachtet werden, da der Authentifizierungskontext des Benutzers nicht berücksichtigt wird. Diese Regeln können nützlich sein, um öffentliche Daten wie Spielelemente, Audiodateien oder andere statische Inhalte anzuzeigen.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Authentifiziert privat

In bestimmten Fällen möchten Sie möglicherweise, dass Daten für alle authentifizierten Benutzer Ihrer Anwendung sichtbar sind, nicht jedoch für nicht authentifizierte Benutzer. Da die Variable request.auth für alle nicht authentifizierten Benutzer null ist, müssen Sie nur überprüfen, request.auth Variable request.auth vorhanden ist, um eine Authentifizierung zu erfordern:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

Benutzer privat

Der bei weitem häufigste Anwendungsfall für request.auth darin, einzelnen Benutzern request.auth Berechtigungen für ihre Dateien zu erteilen: vom Hochladen von Profilbildern bis zum Lesen privater Dokumente.

Da Dateien in Cloud Storage einen vollständigen "Pfad" zu der Datei haben, ist alles, was erforderlich ist, um eine von einem Benutzer kontrollierte Datei zu erstellen, eine eindeutige, benutzeridentifizierende Information im Dateinamenpräfix (z. B. die Benutzer- uid ), die überprüft werden kann wenn die Regel ausgewertet wird:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

Gruppe privat

Ein weiterer ebenso häufiger Anwendungsfall besteht darin, Gruppenberechtigungen für ein Objekt zuzulassen, z. B. die Zusammenarbeit mehrerer Teammitglieder an einem freigegebenen Dokument. Hierfür gibt es verschiedene Ansätze:

  • Erstellen Sie ein benutzerdefiniertes Firebase-Authentifizierungs- Token , das zusätzliche Informationen zu einem Gruppenmitglied enthält (z. B. eine Gruppen-ID).
  • Umfassen Gruppeninformation (wie eine Gruppen - ID oder eine Liste von autorisierten uid s) in den Datei - Metadaten

Sobald diese Daten in den Token- oder Dateimetadaten gespeichert sind, können sie innerhalb einer Regel referenziert werden:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Bewertung anfordern

Uploads, Downloads, Änderungen und Löschungen von Metadaten werden anhand der an Cloud Storage gesendeten request ausgewertet. Zusätzlich zu der eindeutigen ID des Benutzers und der Nutzlast der Firebase-Authentifizierung im Objekt request.auth , wie oben beschrieben, enthält die request den Dateipfad, in dem die Anforderung ausgeführt wird, den Zeitpunkt des Empfangs der Anforderung und den neuen resource if Die Anfrage ist ein Schreiben. HTTP-Header und Authentifizierungsstatus sind ebenfalls enthalten.

Das request enthält auch die eindeutige ID des Benutzers und die Nutzdaten für die Firebase-Authentifizierung im Objekt request.auth , die im Abschnitt Benutzerbasierte Sicherheit der Dokumente näher erläutert werden.

Eine vollständige Liste der Eigenschaften im request unten:

Eigentum Art Beschreibung
auth map <string, string> Wenn ein Benutzer angemeldet ist, gibt er uid , die eindeutige ID des Benutzers und das token , eine Karte der JWT-Ansprüche für die Firebase-Authentifizierung. Andernfalls ist es null .
params map <string, string> Karte mit den Abfrageparametern der Anforderung.
path Pfad Ein path der den Pfad darstellt, auf dem die Anforderung ausgeführt wird.
resource map <string, string> Der neue Ressourcenwert, der nur bei write .
time Zeitstempel Ein Zeitstempel, der die Serverzeit darstellt, zu der die Anforderung ausgewertet wird.

Ressourcenbewertung

Bei der Auswertung von Regeln möchten Sie möglicherweise auch die Metadaten der Datei auswerten, die hochgeladen, heruntergeladen, geändert oder gelöscht wird. Auf diese Weise können Sie komplexe und leistungsstarke Regeln erstellen, mit denen beispielsweise nur Dateien mit bestimmten Inhaltstypen hochgeladen oder nur Dateien mit einer bestimmten Größe gelöscht werden können.

Die Firebase-Sicherheitsregeln für Cloud-Speicher stellen Dateimetadaten im resource bereit, die Schlüssel / Wert-Paare der in einem Cloud-Speicherobjekt aufgetauchten Metadaten enthalten. Diese Eigenschaften können bei read oder write überprüft werden, um die Datenintegrität sicherzustellen.

Bei write (z. B. Uploads, Aktualisierungen und Löschungen von Metadaten) können Sie zusätzlich zum resource , das Dateimetadaten für die Datei enthält, die derzeit im Anforderungspfad vorhanden ist, auch das Objekt request.resource . Dies enthält eine Teilmenge der zu schreibenden Dateimetadaten, wenn das Schreiben zulässig ist. Sie können diese beiden Werte verwenden, um die Datenintegrität sicherzustellen oder Anwendungseinschränkungen wie Dateityp oder -größe durchzusetzen.

Eine vollständige Liste der Eigenschaften im resource unten:

Eigentum Art Beschreibung
name Zeichenfolge Der vollständige Name des Objekts
bucket Zeichenfolge Der Name des Buckets, in dem sich dieses Objekt befindet.
generation int Die Google Cloud Storage-Objektgenerierung dieses Objekts.
metageneration int Die Metageneration des Google Cloud Storage-Objekts für dieses Objekt.
size int Die Größe des Objekts in Bytes.
timeCreated Zeitstempel Ein Zeitstempel, der die Zeit darstellt, zu der ein Objekt erstellt wurde.
updated Zeitstempel Ein Zeitstempel, der die Zeit darstellt, zu der ein Objekt zuletzt aktualisiert wurde.
md5Hash Zeichenfolge Ein MD5-Hash des Objekts.
crc32c Zeichenfolge Ein crc32c-Hash des Objekts.
etag Zeichenfolge Das mit diesem Objekt verknüpfte Etag.
contentDisposition Zeichenfolge Die diesem Objekt zugeordnete Inhaltsdisposition.
contentEncoding Zeichenfolge Die diesem Objekt zugeordnete Inhaltscodierung.
contentLanguage Zeichenfolge Die diesem Objekt zugeordnete Inhaltssprache.
contentType Zeichenfolge Der diesem Objekt zugeordnete Inhaltstyp.
metadata map <string, string> Schlüssel / Wert-Paare zusätzlicher, vom Entwickler angegebener benutzerdefinierter Metadaten.

request.resource enthält alle diese request.resource mit Ausnahme von generation , metageneration , etag , timeCreated und updated .

Daten validieren

Firebase-Sicherheitsregeln für Cloud-Speicher können auch zur Datenüberprüfung verwendet werden, einschließlich der Überprüfung des Dateinamens und -pfads sowie der Eigenschaften von contentType wie contentType und size .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

Benutzerdefinierte Funktionen

Wenn Ihre Firebase-Sicherheitsregeln komplexer werden, möchten Sie möglicherweise eine Reihe von Bedingungen in Funktionen einbinden, die Sie in Ihrem Regelsatz wiederverwenden können. Sicherheitsregeln unterstützen benutzerdefinierte Funktionen. Die Syntax für benutzerdefinierte Funktionen ähnelt JavaScript, aber die Funktionen der Firebase-Sicherheitsregeln sind in einer domänenspezifischen Sprache geschrieben, die einige wichtige Einschränkungen aufweist:

  • Funktionen können nur eine einzige return Anweisung enthalten. Sie können keine zusätzliche Logik enthalten. Beispielsweise können sie keine Schleifen ausführen oder externe Dienste aufrufen.
  • Funktionen können automatisch auf Funktionen und Variablen aus dem Bereich zugreifen, in dem sie definiert sind. Beispielsweise hat eine im Bereich " service firebase.storage des service firebase.storage definierte Funktion Zugriff auf die resource und nur für den Cloud Firestore integrierte Funktionen wie get() und exists() .
  • Funktionen können andere Funktionen aufrufen, aber möglicherweise nicht wiederkehren. Die Gesamttiefe des Aufrufstapels ist auf 10 begrenzt.
  • In Versionsregeln2 rules2 Funktionen Variablen mit dem Schlüsselwort let definieren. Funktionen können eine beliebige Anzahl von Let-Bindungen haben, müssen jedoch mit einer return-Anweisung enden.

Eine Funktion wird mit dem definierten function Schlüsselwort und nimmt null oder mehr Argumente. Beispielsweise möchten Sie möglicherweise die beiden in den obigen Beispielen verwendeten Arten von Bedingungen in einer einzigen Funktion kombinieren:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

Durch die Verwendung von Funktionen in Ihren Firebase-Sicherheitsregeln können diese mit zunehmender Komplexität Ihrer Regeln besser gewartet werden.

Nächste Schritte

Nach dieser Erörterung der Bedingungen haben Sie ein besseres Verständnis der Regeln und sind bereit:

Erfahren Sie, wie Sie mit den wichtigsten Anwendungsfällen umgehen und wie Sie Regeln entwickeln, testen und bereitstellen: