Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Grundlegende Sicherheitsregeln

Mit Firebase-Sicherheitsregeln können Sie den Zugriff auf Ihre gespeicherten Daten kontrollieren. Die flexible Regelsyntax bedeutet, dass Sie Regeln erstellen können, die mit allem übereinstimmen, von allen Schreibvorgängen in die gesamte Datenbank bis hin zu Operationen an einem bestimmten Dokument.

In diesem Leitfaden werden einige der grundlegenderen Anwendungsfälle beschrieben, die Sie möglicherweise implementieren möchten, wenn Sie Ihre App einrichten und Ihre Daten schützen. Bevor Sie jedoch mit dem Schreiben von Regeln beginnen, möchten Sie vielleicht mehr über die Sprache und ihr Verhalten erfahren.

Um auf Ihre Regeln zuzugreifen und sie zu aktualisieren, befolgen Sie die Schritte unter Verwalten und Bereitstellen von Firebase-Sicherheitsregeln .

Standardregeln: Gesperrter Modus

Wenn Sie in der Firebase-Konsole eine Datenbank oder Speicherinstanz erstellen, legen Sie fest, ob Ihre Firebase-Sicherheitsregeln den Zugriff auf Ihre Daten beschränken ( gesperrter Modus ) oder jedem Zugriff gewähren ( Testmodus ). In Cloud Firestore und Realtime Database verweigern die Standardregeln für den gesperrten Modus allen Nutzern den Zugriff. In Cloud Storage können nur authentifizierte Nutzer auf die Storage-Buckets zugreifen.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Echtzeit-Datenbank

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Cloud-Speicher

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Entwicklungsumgebungsregeln

Während Sie an Ihrer App arbeiten, möchten Sie möglicherweise einen relativ offenen oder uneingeschränkten Zugriff auf Ihre Daten. Stellen Sie nur sicher, dass Sie Ihre Regeln aktualisieren, bevor Sie Ihre App für die Produktion bereitstellen. Denken Sie auch daran, dass Ihre App, wenn Sie sie bereitstellen, öffentlich zugänglich ist – auch wenn Sie sie nicht gestartet haben.

Denken Sie daran, dass Firebase Clients den direkten Zugriff auf Ihre Daten ermöglicht und Firebase-Sicherheitsregeln die einzige Schutzmaßnahme sind, die den Zugriff für böswillige Benutzer blockiert. Das Definieren von Regeln getrennt von der Produktlogik hat eine Reihe von Vorteilen: Clients sind nicht für die Durchsetzung der Sicherheit verantwortlich, fehlerhafte Implementierungen gefährden Ihre Daten nicht und vor allem verlassen Sie sich nicht auf einen Zwischenserver, um Daten vor der Welt zu schützen.

Alle authentifizierten Benutzer

Wir empfehlen zwar nicht, dass Ihre Daten jedem angemeldeten Benutzer zugänglich bleiben, es kann jedoch nützlich sein, den Zugriff auf jeden authentifizierten Benutzer festzulegen, während Sie Ihre App entwickeln.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Echtzeit-Datenbank

{
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
  }
}

Cloud-Speicher

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Serienreife Regeln

Stellen Sie bei der Vorbereitung der Bereitstellung Ihrer App sicher, dass Ihre Daten geschützt sind und Ihren Benutzern der Zugriff ordnungsgemäß gewährt wird. Nutzen Sie die Authentifizierung , um einen benutzerbasierten Zugriff einzurichten, und lesen Sie direkt aus Ihrer Datenbank, um einen datenbasierten Zugriff einzurichten.

Ziehen Sie das Schreiben von Regeln in Betracht, während Sie Ihre Daten strukturieren, da die Art und Weise, wie Sie Ihre Regeln einrichten, sich darauf auswirkt, wie Sie den Zugriff auf Daten auf verschiedenen Pfaden einschränken.

Zugriff nur für Inhaltseigentümer

Diese Regeln beschränken den Zugriff nur auf den authentifizierten Eigentümer des Inhalts. Die Daten sind nur von einem Benutzer lesbar und schreibbar, und der Datenpfad enthält die Benutzerkennung.

Wenn diese Regel funktioniert: Diese Regel funktioniert gut, wenn Daten vom Benutzer isoliert werden – wenn der einzige Benutzer, der auf die Daten zugreifen muss, derselbe Benutzer ist, der die Daten erstellt hat.

Wenn diese Regel nicht funktioniert: Dieser Regelsatz funktioniert nicht, wenn mehrere Benutzer dieselben Daten schreiben oder lesen müssen – Benutzer überschreiben Daten oder können nicht auf von ihnen erstellte Daten zugreifen.

So richten Sie diese Regel ein: Erstellen Sie eine Regel, die bestätigt, dass der Benutzer, der den Zugriff auf Lese- oder Schreibdaten anfordert, der Benutzer ist, dem diese Daten gehören.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Echtzeit-Datenbank

{
  "rules": {
    "some_path": {
      "$uid": {
        // Allow only authenticated content owners access to their data
        ".read": "auth != null && auth.uid == $uid"
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

Cloud-Speicher

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Gemischter öffentlicher und privater Zugang

Diese Regel ermöglicht es jedem, einen Datensatz zu lesen, schränkt jedoch die Möglichkeit ein, Daten in einem bestimmten Pfad nur für den authentifizierten Inhaltseigentümer zu erstellen oder zu ändern.

Wenn diese Regel funktioniert: Diese Regel funktioniert gut für Apps, die öffentlich lesbare Elemente erfordern, aber den Bearbeitungszugriff auf die Eigentümer dieser Elemente beschränken müssen. Zum Beispiel eine Chat-App oder ein Blog.

Wenn diese Regel nicht funktioniert: Wie die Regel "Nur Inhaltseigentümer" funktioniert dieser Regelsatz nicht, wenn mehrere Benutzer dieselben Daten bearbeiten müssen. Die Benutzer werden letztendlich die Daten des anderen überschreiben.

So richten Sie diese Regel ein: Erstellen Sie eine Regel, die allen Benutzern (oder allen authentifizierten Benutzern) Lesezugriff ermöglicht und bestätigt, dass der Benutzer, der Daten schreibt, der Eigentümer ist.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Echtzeit-Datenbank

{
// Allow anyone to read data, but only authenticated content owners can
// make changes to their data

  "rules": {
    "some_path": {
      "$uid": {
        ".read": true,
        // or ".read": "auth.uid != null" for only authenticated users
        ".write": "auth.uid == $uid"
      }
    }
  }
}

Cloud-Speicher

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Attributbasierter und rollenbasierter Zugriff

Damit diese Regeln funktionieren, müssen Sie Benutzern in Ihren Daten Attribute definieren und zuweisen. Firebase-Sicherheitsregeln vergleichen die Anfrage mit den Daten aus Ihrer Datenbank oder den Metadaten Ihrer Datei, um den Zugriff zu bestätigen oder zu verweigern.

Wenn diese Regel funktioniert: Wenn Sie Benutzern eine Rolle zuweisen, erleichtert diese Regel das Einschränken des Zugriffs basierend auf Rollen oder bestimmten Benutzergruppen. Wenn Sie beispielsweise Noten speichern, können Sie der Gruppe "Schüler" (nur Inhalt lesen), der Gruppe "Lehrer" (in ihrem Fach lesen und schreiben) und der Gruppe "Schulleiter" (lesen Alle Inhalte).

Wenn diese Regel nicht funktioniert: In Echtzeitdatenbank und Cloud Storage können Ihre Regeln die get() Methode, die Cloud Firestore-Regeln integrieren können, nicht nutzen. Folglich müssen Sie Ihre Datenbank- oder Dateimetadaten so strukturieren, dass sie die Attribute widerspiegeln, die Sie in Ihren Regeln verwenden.

So richten Sie diese Regel ein: Fügen Sie in Cloud Firestore ein Feld in die Dokumente Ihrer Nutzer ein, das Sie lesen können, und strukturieren Sie dann Ihre Regel, um dieses Feld zu lesen und den Zugriff bedingt zu gewähren. Erstellen Sie in der Echtzeitdatenbank einen Datenpfad, der die Benutzer Ihrer App definiert und ihnen eine Rolle in einem untergeordneten Knoten zuweist.

Sie können auch benutzerdefinierte Ansprüche in der Authentifizierung einrichten und diese Informationen dann aus der Variablen auth.token in beliebigen Firebase-Sicherheitsregeln auth.token .

Datendefinierte Attribute und Rollen

Diese Regeln funktionieren nur in Cloud Firestore und Realtime Database.

Cloud Firestore

Denken Sie daran, dass Ihnen jedes Mal, wenn Ihre Regeln einen Lesevorgang enthalten, wie die folgenden Regeln, ein Lesevorgang in Cloud Firestore in Rechnung gestellt wird.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"
   }
  }
}

Echtzeit-Datenbank

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'",
        ".read": true
      }
    }
  }
}

Attribute und Rollen für benutzerdefinierte Ansprüche

Richten Sie zum Implementieren dieser Regeln benutzerdefinierte Ansprüche in Firebase Authentication ein und nutzen Sie die Ansprüche dann in Ihren Regeln.

Cloud Firestore

Denken Sie daran, dass Ihnen jedes Mal, wenn Ihre Regeln einen Lesevorgang enthalten, wie die folgenden Regeln, ein Lesevorgang in Cloud Firestore in Rechnung gestellt wird.

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": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid != null && auth.token.writer == true",
        ".read": "auth.uid != null && auth.token.reader == true"
      }
    }
  }
}

Cloud-Speicher

service firebase.storage {
  // 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;
  }
}