Catch up on everthing we announced at this year's Firebase Summit. 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. Doch bevor Sie mit dem Schreiben Regeln beginnen, möchten Sie vielleicht mehr über die lernen Sprache sie geschrieben und ihr Verhalten .

Um den Zugriff und Ihre Regeln zu aktualisieren, befolgen Sie die Schritte in Verwaltung und Firebase Sicherheitsregeln implementieren .

Standardregeln: Gesperrter Modus

Wenn Sie eine Datenbank oder Speicherinstanz in der Firebase - Konsole zu erstellen, wählen Sie , ob Ihre Firebase Sicherheitsregeln Zugriff auf Ihre Daten beschränken (Locked - Modus) oder jemand Zugriff (Test - Modus) ermöglichen. In Cloud - Firestor und Realtime - Datenbank, die Standardregeln für Locked - Modus verweigern den Zugriff auf alle Benutzer. 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;
    }
  }
}

Regeln für die Entwicklungsumgebung

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 , wenn Sie Ihre App bereitstellen, es ist öffentlich zugänglich - auch wenn Sie es nicht ins Leben gerufen.

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 hilfreich 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. Leverage - Authentifizierung einzurichten benutzerbasierten Zugriff und direkt aus der Datenbank gelesenen Daten basierenden einzurichten Zugang.

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 Arbeiten Regel: Diese Regel funktioniert gut , wenn Daten durch den Benutzer Silos untergebracht ist - wenn der einzige Benutzer , dass der Bedarf auf die Daten zugreifen der gleiche Benutzer, der die Daten erstellt.

Wenn diese Regel nicht funktioniert: Dieser Regelsatz nicht funktioniert , wenn mehrere Benutzer schreiben müssen oder die gleichen Daten gelesen - Benutzer Daten überschrieben werden oder nicht in der Lage sein , den Zugriff auf Daten , die sie erstellt haben.

So legen Sie diese Regel auf: eine Regel erstellen, bestätigt der Benutzer Zugriff anfordert lesen oder Schreibdaten der Benutzer, der diese Daten besitzt.

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 Anwendungen , die öffentlich lesbare Elemente erfordern, müssen aber bearbeiten Zugang zu diesen Elementen der Eigentümer zu beschränken. Zum Beispiel eine Chat-App oder ein Blog.

Wenn diese Regel nicht funktioniert: Wie der Inhalt Besitzer einzige Regel, tut dies ruleset nicht arbeiten , wenn mehrere Benutzer die gleichen Daten zu bearbeiten müssen. Die Benutzer werden letztendlich die Daten des anderen überschreiben.

So legen Sie diese Regel auf: Erstellen Sie eine Regel , die für alle Benutzer (oder alle authentifizierten Benutzer) Lesezugriff ermöglicht, und bestätigt der Benutzer das Schreiben von Daten ist der Eigentümer.

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 eine Rolle für die Benutzer sind zuweisen, macht diese Regel leicht zu beschränken Sie den Zugriff basierend auf Rollen oder bestimmte 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 Echtzeit - Datenbank und Cloud - Speicher, können Sie Ihre Regeln nutzen nicht die get() Methode , dass Cloud - Firestor Regeln integrieren können. Folglich müssen Sie Ihre Datenbank- oder Dateimetadaten so strukturieren, dass sie die Attribute widerspiegeln, die Sie in Ihren Regeln verwenden.

Um diese Regel einzurichten: In Cloud - Firestor, umfasst ein Feld in Ihren Benutzern Dokumente , dass Sie lesen können, dann strukturieren Ihre Regel das Feld zu lesen und bedingt Zugang 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 so eingerichtet individuelle Ansprüche in Authentication und Abrufen dann diese Informationen aus der auth.token Variable in allen Firebase Sicherheitsregeln.

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

Um diese Regeln zu implementieren, richten Sie individuelle Ansprüche in Firebase Authentifizierung und dann die Ansprüche in Ihren Regeln nutzen.

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;
  }
}