Firebase-Sicherheitsregeln bieten Zugriffskontrolle und Datenvalidierung in einem Format, das mehrere Komplexitätsebenen unterstützt. Um benutzerbasierte und rollenbasierte Zugriffssysteme zu erstellen, die die Daten Ihrer Benutzer schützen, verwenden Sie die Firebase-Authentifizierung mit Firebase-Sicherheitsregeln.
Benutzer identifizieren
Die Authentifizierung identifiziert Benutzer, die Zugriff auf Ihre Daten anfordern, und stellt diese Informationen als Variable bereit, die Sie in Ihren Regeln nutzen können. Die auth
Variable enthält die folgenden Informationen:
-
uid
: Eine eindeutige Benutzer-ID, die dem anfragenden Benutzer zugewiesen wird. -
token
: Eine Zuordnung von Werten, die von der Authentifizierung gesammelt werden.
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 Benutzer bestätigt hat, dass er Zugriff auf die email Adresse hat. Einige Anbieter verifizieren automatisch ihre eigenen E-Mail-Adressen. |
phone_number | Die dem Konto zugeordnete Telefonnummer, falls vorhanden. |
name | Der Anzeigename des Benutzers, falls festgelegt. |
sub | Die Firebase-UID des Benutzers. Dies ist einmalig innerhalb eines Projektes. |
firebase.identities | Wörterbuch aller Identitäten, die diesem Benutzerkonto zugeordnet 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 eindeutiger Kennungen für jeden mit dem Konto verknüpften Identitätsanbieter. Beispielsweise enthält auth.token.firebase.identities["google.com"][0] die erste mit dem Konto verknüpfte Google-Benutzer-ID. |
firebase.sign_in_provider | Der zum Abrufen dieses Tokens verwendete Anmeldeanbieter. 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 Mandanten-ID, falls vorhanden. zB tenant2-m6tyz |
Wenn Sie angepasste Authentifizierungsattribute hinzufügen möchten, enthält die Variable auth.token
auch alle von Ihnen angegebenen benutzerdefinierten Ansprüche .
Wenn der Benutzer, der den Zugriff anfordert, nicht angemeldet ist, ist die Variable auth
null
. Sie können dies in Ihren Regeln nutzen, wenn Sie beispielsweise den Lesezugriff auf authentifizierte Benutzer beschränken möchten – auth != null
. 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 .
Nutzen Sie Benutzerinformationen in Regeln
In der Praxis macht die Verwendung authentifizierter Informationen in Ihren Regeln Ihre Regeln leistungsfähiger und flexibler. Sie können den Zugriff auf Daten basierend auf der Benutzeridentität steuern.
Definieren Sie in Ihren Regeln, wie die Informationen in der auth
Variablen – die Benutzerinformationen des Anforderers – mit den Benutzerinformationen übereinstimmen, die den angeforderten Daten zugeordnet sind.
Ihre App möchte beispielsweise sicherstellen, dass Benutzer nur ihre eigenen Daten lesen und schreiben können. In diesem Szenario möchten Sie eine Übereinstimmung zwischen der Variablen auth.uid
und der Benutzer-ID für die 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;
}
}
}
Echtzeit-Datenbank
{
"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-Speicher
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;
}
}
Definieren Sie benutzerdefinierte Benutzerinformationen
Sie können die auth
Variable weiter nutzen, um benutzerdefinierte Felder zu definieren, die den Benutzern Ihrer App zugewiesen sind.
Angenommen, Sie möchten eine „Admin“-Rolle erstellen, die den Schreibzugriff auf bestimmte Pfade ermöglicht. Sie würden dieses Attribut Benutzern zuweisen und es dann in den Regeln nutzen, die den Zugriff auf die Pfade gewähren.
In Cloud Firestore können Sie Benutzerdokumenten ein benutzerdefiniertes Feld hinzufügen und den Wert dieses Felds mit einem eingebetteten Lesevorgang in Ihren Regeln abrufen. Ihre admin-basierte Regel würde also wie im folgenden Beispiel 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 Regeln zugreifen, nachdem Sie benutzerdefinierte Ansprüche in Authentifizierung erstellt haben . Sie können dann mit der Variablen 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";
}
}
}
Echtzeit-Datenbank
{
"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-Speicher
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 Regeln, die die Authentifizierung nutzen, finden Sie unter Grundlegende Sicherheitsregeln .