Firebase Security Rules bieten Zugriffssteuerung und Datenvalidierung in einem Format, das mehrere Komplexitätsebenen unterstützt. Wenn Sie nutzer- und rollenbasierte Zugriffssysteme erstellen möchten, die die Datensicherheit Ihrer Nutzer gewährleisten, verwenden Sie Firebase Authentication mit Firebase Security Rules.
Nutzer identifizieren
Authentication identifiziert Nutzer, die Zugriff auf Ihre Daten anfordern, und stellt diese Informationen als Variable bereit, die Sie in Ihren Regeln verwenden können. Die Variable auth enthält die folgenden Informationen:
uid: Eine eindeutige Nutzer-ID, die dem anfragenden Nutzer zugewiesen ist.token: Eine Zuordnung von Werten, die von Authentication erfasst wurden.
Die Variable auth.token enthält die folgenden Werte:
| Feld | Beschreibung |
|---|---|
email |
Die mit dem Konto verknüpfte E‑Mail-Adresse, falls vorhanden. |
email_verified |
true, wenn der Nutzer bestätigt hat, dass er Zugriff auf die Adresse email hat. Einige Anbieter bestätigen E‑Mail-Adressen, die ihnen gehören, automatisch. |
phone_number |
Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden. |
name |
Der Anzeigename des Nutzers, falls festgelegt. |
sub |
Die Firebase-UID des Nutzers. Dieser ist innerhalb eines Projekts eindeutig. |
firebase.identities |
Verzeichnis aller Identitäten, die mit dem Konto dieses Nutzers verknüpft sind. Die Schlüssel des Wörterbuchs können folgende sein: email, phone, google.com, facebook.com, github.com, twitter.com. Die Werte des Wörterbuchs sind Arrays mit eindeutigen Kennungen für jeden Identitätsanbieter, der mit dem Konto verknüpft ist. auth.token.firebase.identities["google.com"][0] enthält beispielsweise die erste Google-Nutzer-ID, die mit dem Konto verknüpft ist. |
firebase.sign_in_provider |
Der Anmeldeanbieter, der zum Abrufen dieses Tokens verwendet wurde. Kann einer der folgenden Strings sein: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com. |
firebase.tenant |
Die mit dem Konto verknüpfte tenantId, falls vorhanden, z. B. tenant2-m6tyz |
Wenn Sie benutzerdefinierte Authentifizierungsattribute hinzufügen möchten, enthält die Variable auth.token auch alle von Ihnen angegebenen benutzerdefinierten Anforderungen.
Wenn der Nutzer, der Zugriff anfordert, nicht angemeldet ist, hat die Variable auth den Wert null.
Sie können dies in Ihren Regeln nutzen, wenn Sie beispielsweise den Lesezugriff auf authentifizierte Nutzer beschränken möchten – auth != null. Wir empfehlen jedoch, den Schreibzugriff weiter einzuschränken.
Weitere Informationen zur Variable auth finden Sie in der Referenzdokumentation für Cloud Firestore, Realtime Database und Cloud Storage.
Nutzerinformationen in Regeln verwenden
In der Praxis werden Ihre Regeln durch die Verwendung authentifizierter Informationen in Ihren Regeln leistungsfähiger und flexibler. Sie können den Zugriff auf Daten anhand der Nutzeridentität steuern.
In Ihren Regeln legen Sie fest, wie die Informationen in der Variable auth (die Nutzerinformationen des Anfragenden) mit den Nutzerinformationen übereinstimmen, die den angeforderten Daten zugeordnet sind.
Beispielsweise möchten Sie mit Ihrer App möglicherweise dafür sorgen, dass Nutzer nur ihre eigenen Daten lesen und schreiben können. In diesem Szenario möchten Sie eine Übereinstimmung zwischen der Variablen auth.uid und der Nutzer-ID in den angeforderten Daten:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// Make sure the uid of the requesting user matches name of the user
// document. The wildcard expression {userId} makes the userId variable
// available in rules.
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}
Realtime Database
{
"rules": {
"users": {
"$userId": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($userId)
".write": "$userId === auth.uid"
}
}
}
}
Cloud Storage
service firebase.storage {
// Only a user can upload their file, but anyone can view it
match /users/{userId}/{fileName} {
allow read;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
Benutzerdefinierte Nutzerinformationen definieren
Sie können die Variable auth auch verwenden, um benutzerdefinierte Felder zu definieren, die den Nutzern Ihrer Anwendung zugewiesen sind.
Angenommen, Sie möchten eine „Administrator“-Rolle erstellen, die Schreibzugriff auf bestimmte Pfade ermöglicht. Sie weisen dieses Attribut Nutzern zu und verwenden es dann in den Regeln, die den Zugriff auf die Pfade gewähren.
In Cloud Firestore können Sie den Dokumenten von Nutzern ein benutzerdefiniertes Feld hinzufügen und den Wert dieses Felds mit einem eingebetteten Lesevorgang in Ihren Regeln abrufen. Ihre administratorbasierte Regel würde also so aussehen:
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents/some_collection: {
// Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
read: if request.auth != null;
}
}
Sie können in Security Rules auf benutzerdefinierte Anforderungen zugreifen, nachdem Sie in Authentication benutzerdefinierte Anforderungen erstellt haben. Anschließend können Sie mit der Variable auth.token auf diese benutzerdefinierten Anforderungen verweisen.
Cloud Firestore
service cloud.firestore {
match /databases/{database}/documents {
// For attribute-based access control, check for an admin claim
allow write: if request.auth.token.admin == true;
allow read: true;
// Alterntatively, for role-based access, assign specific roles to users
match /some_collection/{document} {
allow read: if request.auth.token.reader == "true";
allow write: if request.auth.token.writer == "true";
}
}
}
Realtime Database
{
"rules": {
"some_path": {
"$sub_path": {
// Create a custom claim for the admin role
".write": "auth.uid !== null && auth.token.writer === true",
".read": "auth.uid !== null"
}
}
}
}
Cloud Storage
service firebase.storage {
// Create a custom claim for the admin role
match /files/{fileName} {
allow read: if request.auth.uid != null;
allow write: if request.auth.token.admin == true;
}
}
Weitere Beispiele für grundlegende Security Rules, die Authentication nutzen, finden Sie unter Grundlegende Sicherheitsregeln.