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 Firebase Authentication mit Firebase Security Rules.
Identifizieren Sie Benutzer
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 Karte von Werten, die von der Authentifizierung erfasst 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 E-Mail-Adressen. |
phone_number | Die mit dem Konto verknüpfte Telefonnummer, falls vorhanden. |
name | Der Anzeigename des Benutzers, falls festgelegt. |
sub | Die Firebase-UID des Benutzers. Dies ist innerhalb eines Projekts einzigartig. |
firebase.identities | Wörterbuch aller Identitäten, die mit dem Konto dieses Benutzers 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 eindeutiger Kennungen für jeden mit dem Konto verknüpften Identitätsanbieter. Beispielsweise enthält auth.token.firebase.identities["google.com"][0] die erste Google-Benutzer-ID, die mit dem Konto verknüpft ist. |
firebase.sign_in_provider | Der Anmeldeanbieter, der zum Erhalten dieses Tokens verwendet wurde. Kann eine der folgenden Zeichenfolgen sein: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | Die mit dem Konto verknüpfte Mieter-ID, falls vorhanden. z. tenant2-m6tyz |
Wenn Sie benutzerdefinierte Authentifizierungsattribute hinzufügen möchten, enthält die Variable auth.token
auch alle benutzerdefinierten Ansprüche, die Sie angeben.
Wenn der Benutzer, der Zugriff anfordert, nicht angemeldet ist, ist die auth
null
. Sie können dies in Ihren Regeln nutzen, wenn Sie beispielsweise den Lesezugriff auf authentifizierte Benutzer beschränken möchten – auth != null
. Generell empfehlen wir jedoch, den Schreibzugriff weiter einzuschränken.
Weitere Informationen zur auth
finden Sie in der Referenzdokumentation für Cloud Firestore , Realtime Database und Cloud Storage .
Nutzen Sie Benutzerinformationen in Regeln
In der Praxis werden Ihre Regeln durch die Verwendung authentifizierter Informationen 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
– die Benutzerinformationen des Anforderers – mit den Benutzerinformationen übereinstimmen, die den angeforderten Daten zugeordnet sind.
Beispielsweise möchte Ihre App möglicherweise 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;
}
}
}
Echtzeitdatenbank
{
"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
außerdem nutzen, um benutzerdefinierte Felder zu definieren, die den Benutzern Ihrer App zugewiesen werden.
Angenommen, Sie möchten eine „Administrator“-Rolle erstellen, die 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 den Dokumenten der Benutzer 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 der Authentifizierung erstellt haben . Sie können diese benutzerdefinierten Ansprüche dann mithilfe der Variablen auth.token
referenzieren.
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";
}
}
}
Echtzeitdatenbank
{
"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 .