Firebase Security Rules bieten Zugriffssteuerung und Datenvalidierung in einem Format, das mehrere Komplexitätsebenen unterstützt. Verwenden Sie Firebase Authentication mit Firebase Security Rules, um nutzer- und rollenbasierte Zugriffssysteme zum Schutz der Nutzerdaten zu erstellen.
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 wird.token
:Eine Zuordnungstabelle mit 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, sofern 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 Wert ist innerhalb eines Projekts eindeutig. |
firebase.identities |
Wörterbuch aller Identitäten, die dem Konto dieses Nutzers zugeordnet sind. Die Schlüssel des Wörterbuchs können einen der folgenden Werte haben: email , phone , google.com , facebook.com , github.com oder twitter.com . Die Werte des Wörterbuchs sind Arrays eindeutiger IDs 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. Es kann sich um einen der folgenden Strings handeln: custom , password , phone , anonymous , google.com , facebook.com , github.com oder 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 Ansprüche.
Wenn der Nutzer, der den Zugriff anfordert, nicht angemeldet ist, hat die Variable auth
den Wert null
.
Sie können dies in Ihren Regeln verwenden, wenn Sie beispielsweise den Lesezugriff auf authentifizierte Nutzer, wie auth != null
, beschränken möchten. Wir empfehlen jedoch generell, den Schreibzugriff weiter einzuschränken.
Weitere Informationen zur Variablen auth
finden Sie in der Referenzdokumentation für Cloud Firestore, Realtime Database und Cloud Storage.
Nutzerinformationen in Regeln nutzen
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 basierend auf der Nutzeridentität steuern.
Legen Sie in Ihren Regeln fest, wie die Informationen in der Variablen auth
– die Nutzerinformationen des Antragstellers – mit den Nutzerinformationen übereinstimmen, die mit den angeforderten Daten verknüpft sind.
So kann beispielsweise sichergestellt werden, dass Nutzer nur ihre eigenen Daten lesen und schreiben können. In diesem Szenario sollte eine Übereinstimmung zwischen der Variablen auth.uid
und der Nutzer-ID in den angeforderten Daten bestehen:
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
Außerdem können Sie mit der Variablen auth
benutzerdefinierte Felder definieren, die den Nutzern Ihrer App zugewiesen sind.
Angenommen, Sie möchten eine Rolle „Administrator“ erstellen, die Schreibzugriff auf bestimmte Pfade ermöglicht. Dieses Attribut weisen Sie Nutzern zu und verwenden es dann in den Regeln, die Zugriff auf die Pfade gewähren.
In Cloud Firestore können Sie den Dokumenten der Nutzer ein benutzerdefiniertes Feld hinzufügen und den Wert dieses Felds mit einer eingebetteten Leseaktion in Ihren Regeln abrufen. Ihre verwaltete 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 auf benutzerdefinierte Ansprüche in Rules zugreifen, nachdem Sie sie in Authentication erstellt haben. Sie können dann über die Variable auth.token
auf diese benutzerdefinierten Ansprüche 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 die grundlegende Nutzung von Rules mit Authentication finden Sie unter Grundlegende Sicherheitsregeln.