Firebase Security Rules für Cloud Storage wird in Firebase Authentication eingebunden, um Folgendes bereitzustellen: leistungsstarke, nutzerbasierte Authentifizierung bei Cloud Storage. So ist eine detaillierte Zugriffssteuerung basierend auf den Berechtigungen eines Firebase Authentication-Tokens möglich.
Nutzerauthentifizierung
Wenn ein authentifizierter Nutzer eine Anfrage an Cloud Storage stellt,
Die Variable request.auth
wird mit dem uid
des Nutzers gefüllt
(request.auth.uid
) sowie die Anforderungen des Firebase Authentication-JWT
(request.auth.token
).
Außerdem werden bei Verwendung der benutzerdefinierten Authentifizierung zusätzliche Ansprüche angezeigt.
im Feld request.auth.token
ein.
Wenn ein nicht authentifizierter Nutzer eine Anfrage ausführt, wird die Variable request.auth
null
.
Es gibt mehrere gängige Methoden, mithilfe der Authentifizierung Dateien:
- Öffentlich:
request.auth
ignorieren - Privat authentifiziert: Prüfen Sie, ob
request.auth
nichtnull
ist - Nutzerprivat: Prüfen Sie, ob
request.auth.uid
einem Pfaduid
entspricht. - Gruppe privat: Prüfen, ob die Behauptungen des benutzerdefinierten Tokens mit einer ausgewählten Behauptung übereinstimmen, oder die Dateimetadaten lesen, um zu prüfen, ob ein Metadatenfeld vorhanden ist
Öffentlich
Jede Regel, bei der der request.auth
-Kontext nicht berücksichtigt wird, kann als public
-Regel betrachtet werden, da der Authentifizierungskontext des Nutzers nicht berücksichtigt wird.
Diese Regeln können nützlich sein, um öffentliche Daten wie Game-Assets, Audiodateien oder andere statische Inhalte zu präsentieren.
// 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 als privat
In bestimmten Fällen möchten Sie möglicherweise, dass Daten für alle authentifizierten Nutzer Ihrer Anwendung sichtbar sind, aber nicht für nicht authentifizierte Nutzer. Seit dem request.auth
ist null
für alle nicht authentifizierten Nutzer. Sie müssen nur die
Die Variable request.auth
ist vorhanden, damit eine Authentifizierung erforderlich ist:
// Require authentication on all internal image reads match /internal/{imageId} { allow read: if request.auth != null; }
Nur für Nutzer sichtbar
Der mit Abstand häufigste Anwendungsfall für request.auth
besteht darin, einzelnen Nutzern detaillierte Berechtigungen für ihre Dateien zuzuweisen, vom Hochladen von Profilbildern bis zum Lesen privater Dokumente.
Da Dateien in Cloud Storage einen vollständigen Pfad zur Datei haben, ist für die Steuerung einer Datei durch einen Nutzer nur eine eindeutige, den Nutzer identifizierende Information im Dateipfad erforderlich (z. B. die uid
des Nutzers), die bei der Auswertung der Regel geprüft werden kann:
// 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 != null && request.auth.uid == userId; }
Gruppe privat
Ein weiterer, ebenso häufiger Anwendungsfall ist die Zulassung von Gruppenberechtigungen für ein Objekt. z. B. um mehreren Teammitgliedern die Zusammenarbeit an einem freigegebenen Dokument zu ermöglichen. Es gibt es mehrere Ansätze:
- Erstellen Sie ein benutzerdefiniertes Firebase Authentication-Token. die zusätzliche Informationen zu einem Gruppenmitglied enthält, z. B. eine Gruppen-ID
- Füge den Dateimetadaten Gruppeninformationen wie einer Gruppen-ID oder einer Liste der autorisierten
uid
s hinzu.
Sobald diese Daten in den Token- oder Dateimetadaten gespeichert sind, können sie in 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; }
Vollständiges Beispiel
Einfache Fälle der vier häufigsten Arten von Authentifizierungseinschränkungen werden gezeigt. im Beispiel unten:
service firebase.storage { match /b/{bucket}/o { match /images { // Anyone can view any image (no auth, publicly readable) match /{allImages=**} { allow read; } // Only authenticated users can write to "public" images match /public/{imageId} { allow write: if request.auth != null; } // Only an individual user can write to "their" images match /{userId}/{imageId} { allow write: if request.auth.uid == userId; } // Allow a "group" of users to read/write to shared images // An owner metadata property on the object contains the groupId for reads // A custom token has been minted with a groupId property for writes match /{groupId}/{imageId} { allow read: if resource.metadata.owner == request.auth.token.groupId; allow write: if request.auth.token.groupId == groupId; } } } }