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

So funktionieren Sicherheitsregeln

Sicherheit kann eines der komplexesten Puzzleteile der App-Entwicklung sein. In den meisten Anwendungen müssen Entwickler einen Server erstellen und ausführen, der die Authentifizierung (wer ein Benutzer ist) und die Autorisierung (was ein Benutzer tun kann) handhabt.

Firebase-Sicherheitsregeln entfernen die mittlere (Server-)Schicht und ermöglichen es Ihnen, pfadbasierte Berechtigungen für Clients anzugeben, die sich direkt mit Ihren Daten verbinden. In diesem Leitfaden erfahren Sie mehr darüber, wie Regeln auf eingehende Anforderungen angewendet werden.

Wählen Sie ein Produkt aus, um mehr über seine Regeln zu erfahren.

Cloud Firestore

Grundstruktur

Firebase-Sicherheitsregeln in Cloud Firestore und Cloud Storage verwenden die folgende Struktur und Syntax:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

Es ist wichtig, die folgenden Schlüsselkonzepte beim Erstellen der Regeln zu verstehen:

  • Request: Die Methode oder Methoden, die in der allow Anweisung aufgerufen werden. Dies sind Methoden, die Sie ausführen dürfen. Die Standardmethoden sind: get , list , create , update und delete . Die bequemen read und write ermöglichen einen breiten Lese- und Schreibzugriff auf die angegebene Datenbank oder den angegebenen Speicherpfad.
  • Pfad: Die Datenbank oder der Speicherort, dargestellt als URI-Pfad.
  • Regel: Die allow Anweisung, die eine Bedingung enthält, die eine Anforderung zulässt, wenn sie als wahr ausgewertet wird.

Sicherheitsregeln Version 2

Ab Mai 2019 ist jetzt Version 2 der Firebase-Sicherheitsregeln verfügbar. Version 2 der Regeln ändert das Verhalten von rekursiven Platzhaltern {name=**} . Sie müssen Version 2 verwenden, wenn Sie Sammlungsgruppenabfragen verwenden möchten . Sie müssen sich für Version 2 rules_version = '2'; indem Sie rules_version = '2'; die erste Zeile in Ihren Sicherheitsregeln:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

Passende Pfade

Alle Match-Anweisungen sollten auf Dokumente verweisen, nicht auf Sammlungen. Eine match-Anweisung kann auf ein bestimmtes Dokument verweisen, wie in match /cities/SF oder Platzhalter verwenden, um auf ein beliebiges Dokument im angegebenen Pfad zu verweisen, wie in match /cities/{city} .

Im obigen Beispiel verwendet die match-Anweisung die Platzhaltersyntax {city} . Dies bedeutet, dass die Regel für jedes Dokument in der cities , z. B. /cities/SF oder /cities/NYC . Wenn die allow Ausdrücke in der Match - Anweisung ausgewertet werden, die city wird variabel in die Stadt Dokumentnamen, wie lösen SF oder NYC .

Passende Untersammlungen

Daten in Cloud Firestore sind in Dokumentensammlungen organisiert, und jedes Dokument kann die Hierarchie durch Untersammlungen erweitern. Es ist wichtig zu verstehen, wie Sicherheitsregeln mit hierarchischen Daten interagieren.

Betrachten wir die Situation , in der jedes Dokument in den cities Kollektion enthält landmarks Untersammlung. Sicherheitsregeln gelten nur in dem Anpassungspfad, so dass die Zugriffskontrollen auf der definierten cities Sammlung nicht auf die Anwendung der landmarks Untersammlung. Schreiben Sie stattdessen explizite Regeln, um den Zugriff auf Untersammlungen zu kontrollieren:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if <condition>;

        // Explicitly define rules for the 'landmarks' subcollection
        match /landmarks/{landmark} {
          allow read, write: if <condition>;
        }
    }
  }
}

Beim Verschachteln von match Anweisungen ist der Pfad der inneren match Anweisung immer relativ zum Pfad der äußeren match Anweisung. Die folgenden Regelsätze sind daher äquivalent:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}
service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city}/landmarks/{landmark} {
      allow read, write: if <condition>;
    }
  }
}

Rekursive Platzhalter

Wenn Regeln auf eine beliebig tiefe Hierarchie angewendet werden sollen, verwenden Sie die rekursive Platzhaltersyntax {name=**} :

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Bei Verwendung der rekursiven Platzhaltersyntax enthält die Platzhaltervariable das gesamte übereinstimmende Pfadsegment, auch wenn sich das Dokument in einer tief verschachtelten Untersammlung befindet. Die oben aufgeführten Regeln würden beispielsweise einem Dokument unter /cities/SF/landmarks/coit_tower , und der Wert der document wäre SF/landmarks/coit_tower .

Beachten Sie jedoch, dass das Verhalten rekursiver Platzhalter von der Regelversion abhängt.

Version 1

Sicherheitsregeln verwenden standardmäßig Version 1. In Version 1 entsprechen rekursive Platzhalter einem oder mehreren Pfadelementen. Sie stimmen nicht mit einem leeren Pfad match /cities/{city}/{document=**} , also entspricht match /cities/{city}/{document=**} Dokumenten in Untersammlungen, aber nicht in der cities Sammlung, während match /cities/{document=**} auf beide Dokumente in der cities Sammlung und Subkollektionen.

Rekursive Wildcards müssen am Ende einer Match-Anweisung stehen.

Version 2

In Version 2 der Sicherheitsregeln entsprechen rekursive Platzhalter null oder mehr Pfadelementen. match/cities/{city}/{document=**} ordnet Dokumente in beliebigen Untersammlungen sowie Dokumente in der cities .

Sie müssen sich für Version 2 rules_version = '2'; indem Sie rules_version = '2'; hinzufügen rules_version = '2'; ganz oben in Ihren Sicherheitsregeln:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{city}/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Sie können höchstens einen rekursiven Platzhalter pro Match-Anweisung verwenden, aber in Version 2 können Sie diesen Platzhalter an einer beliebigen Stelle in der Match-Anweisung platzieren. Beispielsweise:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the songs collection group
    match /{path=**}/songs/{song} {
      allow read, write: if <condition>;
    }
  }
}

Wenn Sie Sammlungsgruppenabfragen verwenden , müssen Sie Version 2 verwenden, siehe Sichern von Sammlungsgruppenabfragen .

Überlappende Match-Statements

Es ist möglich, dass ein Dokument mit mehr als einer match Anweisung match . Falls mehrere allow mit einer Anfrage übereinstimmen, wird der Zugriff zugelassen, wenn eine der Bedingungen true :

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the 'cities' collection.
    match /cities/{city} {
      allow read, write: if false;
    }

    // Matches any document in the 'cities' collection or subcollections.
    match /cities/{document=**} {
      allow read, write: if true;
    }
  }
}

Im obigen Beispiel sind alle Lese- und Schreibvorgänge in der cities Auflistung zulässig, da die zweite Regel immer true , obwohl die erste Regel immer false .

Grenzwerte für Sicherheitsregeln

Beachten Sie beim Arbeiten mit Sicherheitsregeln die folgenden Beschränkungen:

Grenze Einzelheiten
Maximale Anzahl der exists() ist get() getAfter() exists() , get() und getAfter() ruft pro Anfrage
  • 10 für Einzeldokumentanforderungen und Abfrageanforderungen.
  • 20 für Multi-Dokument-Lesevorgänge, Transaktionen und Schreibvorgänge im Stapel. Die bisherige Grenze von 10 gilt auch für jeden Vorgang.

    Stellen Sie sich beispielsweise vor, Sie erstellen eine Batch-Schreibanforderung mit 3 Schreibvorgängen und Ihre Sicherheitsregeln verwenden 2 Dokumentzugriffsaufrufe, um jeden Schreibvorgang zu validieren. In diesem Fall verwendet jeder Schreibvorgang 2 seiner 10 Zugriffsaufrufe und die gestapelte Schreibanforderung verwendet 6 seiner 20 Zugriffsaufrufe.

Das Überschreiten eines der Grenzwerte führt zu einem Berechtigungsverweigerungsfehler.

Einige Dokumentzugriffsaufrufe können zwischengespeichert werden, und zwischengespeicherte Aufrufe zählen nicht zu den Grenzwerten.

Maximale Tiefe der verschachtelten match Anweisung 10
Maximal zulässige Pfadlänge in Pfadsegmenten innerhalb eines Satzes von verschachtelten match Anweisungen 100
Maximal zulässige Anzahl von Pfaderfassungsvariablen in einem Satz verschachtelter match Anweisungen 20
Maximale Tiefe des Funktionsaufrufs 20
Maximale Anzahl von Funktionsargumenten 7
Maximale Anzahl von let Variablenbindungen pro Funktion 10
Maximale Anzahl rekursiver oder zyklischer Funktionsaufrufe 0 (nicht zulässig)
Maximale Anzahl von Ausdrücken, die pro Anfrage ausgewertet werden 1.000
Maximale Größe eines Regelsatzes Verax-Regelsätze müssen zwei Größenbeschränkungen einhalten:
  • eine Beschränkung von 256 KB für die Größe der Verax-Regelsatz-Textquelle, die über die Firebase-Konsole oder über die CLI mit firebase deploy Deploy veröffentlicht wird.
  • ein Limit von 250 KB für die Größe des kompilierten Regelsatzes, der entsteht, wenn Firebase die Verax-Quelle verarbeitet und im Back-End aktiviert.

Cloud-Speicher

Grundstruktur

Firebase-Sicherheitsregeln in Cloud Firestore und Cloud Storage verwenden die folgende Struktur und Syntax:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

Es ist wichtig, die folgenden Schlüsselkonzepte beim Erstellen der Regeln zu verstehen:

  • Request: Die Methode oder Methoden, die in der allow Anweisung aufgerufen wurden. Dies sind Methoden, die Sie ausführen dürfen. Die Standardmethoden sind: get , list , create , update und delete . Die bequemen read und write ermöglichen einen breiten Lese- und Schreibzugriff auf die angegebene Datenbank oder den angegebenen Speicherpfad.
  • Pfad: Die Datenbank oder der Speicherort, dargestellt als URI-Pfad.
  • Regel: Die allow Anweisung, die eine Bedingung enthält, die eine Anforderung zulässt, wenn sie als wahr ausgewertet wird.

Passende Pfade

Cloud Storage-Sicherheitsregeln match den Dateipfaden match die für den Zugriff auf Dateien in Cloud Storage verwendet werden. Regeln können match genaue Pfade oder Wildcard - Pfade und Regeln auch verschachtelt werden können. Wenn keine Übereinstimmungsregel eine Anforderungsmethode zulässt oder die Bedingung als false ausgewertet wird, wird die Anforderung abgelehnt.

Genaue Übereinstimmungen

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

Verschachtelte Übereinstimmungen

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

Wildcard-Übereinstimmungen

Regeln können auch verwendet werden, match ein Muster mithilfe von Platzhaltern abzugleichen. Ein Platzhalter ist eine benannte Variable, die entweder eine einzelne Zeichenfolge wie profilePhoto.png oder mehrere profilePhoto.png wie images/profilePhoto.png .

Ein Platzhalter wird erstellt, indem der Platzhaltername in geschweifte Klammern eingefügt wird, z. B. {string} . Ein Platzhalter für mehrere Segmente kann deklariert werden, indem dem Platzhalternamen =** hinzugefügt wird, wie {path=**} :

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Stimmen mehrere Regeln mit einer Datei überein, ist das Ergebnis das OR des Ergebnisses aller Regelauswertungen. Das heißt, wenn eine Regel, der die Datei entspricht, mit true bewertet wird, ist das Ergebnis true .

In den obigen Regeln kann die Datei "images/profilePhoto.png" gelesen werden, wenn entweder condition oder other_condition als wahr ausgewertet wird, während die Datei "images/users/user:12345/profilePhoto.png" nur dem Ergebnis von other_condition .

Auf eine Wildcard-Variable kann innerhalb des match verwiesen werden, indem der Dateiname oder die Pfadberechtigung angegeben wird:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Cloud Storage-Sicherheitsregeln kaskadieren nicht und Regeln werden nur ausgewertet, wenn der Anfragepfad mit einem Pfad mit den angegebenen Regeln übereinstimmt.

Bewertung anfordern

Uploads, Downloads, Metadatenänderungen und Löschungen werden anhand der an Cloud Storage gesendeten request ausgewertet. Die request enthält den Dateipfad, in dem die Anforderung ausgeführt wird, die Zeit, zu der die Anforderung empfangen wurde, und den neuen resource , wenn die Anforderung eine Schreibanforderung ist. HTTP-Header und Authentifizierungsstatus sind ebenfalls enthalten.

Die request - Objekt enthält auch die eindeutige ID des Benutzers und die Firebase Authentication Nutzlast in dem request.auth Objekt, das weiter in dem erläutert wird Authentication Abschnitt der Dokumentation.

Eine vollständige Liste der Eigenschaften im request ist unten verfügbar:

Eigentum Art Beschreibung
auth map<string, string> Wenn ein Benutzer angemeldet ist, stellt uid , die eindeutige ID des Benutzers, und token , eine Zuordnung der JWT-Ansprüche von Firebase Authentication, bereit. Andernfalls ist es null .
params map<string, string> Map mit den Abfrageparametern der Anfrage.
path Pfad Ein path der den Pfad darstellt, auf dem die Anforderung ausgeführt wird.
resource map<string, string> Der neue Ressourcenwert, der nur bei write .
time Zeitstempel Ein Zeitstempel, der die Serverzeit darstellt, zu der die Anforderung ausgewertet wird.

Ressourcenbewertung

Beim Auswerten von Regeln möchten Sie möglicherweise auch die Metadaten der Datei auswerten, die hochgeladen, heruntergeladen, geändert oder gelöscht wird. Auf diese Weise können Sie komplexe und leistungsstarke Regeln erstellen, die beispielsweise nur das Hochladen von Dateien mit bestimmten Inhaltstypen oder das Löschen von Dateien ab einer bestimmten Größe zulassen.

Firebase Security Rules for Cloud Storage stellt Dateimetadaten im resource bereit, das Schlüssel/Wert-Paare der in einem Cloud Storage-Objekt aufgetauchten Metadaten enthält. Diese Eigenschaften können bei read oder write überprüft werden, um die Datenintegrität sicherzustellen.

Bei write (wie Uploads, Metadatenaktualisierungen und -löschungen) können Sie zusätzlich zum resource , das Dateimetadaten für die Datei enthält, die derzeit im Anforderungspfad vorhanden ist, auch das request.resource Objekt verwenden. die eine Teilmenge der zu schreibenden Dateimetadaten enthält, wenn das Schreiben erlaubt ist. Sie können diese beiden Werte verwenden, um die Datenintegrität sicherzustellen oder Anwendungseinschränkungen wie Dateityp oder -größe durchzusetzen.

Eine vollständige Liste der Eigenschaften im resource ist unten verfügbar:

Eigentum Art Beschreibung
name Schnur Der vollständige Name des Objekts
bucket Schnur Der Name des Buckets, in dem sich dieses Objekt befindet.
generation int Die Google Cloud Storage-Objektgenerierung dieses Objekts.
metageneration int Die Google Cloud Storage-Objekt-Metagenerierung dieses Objekts.
size int Die Größe des Objekts in Byte.
timeCreated Zeitstempel Ein Zeitstempel, der die Zeit angibt, zu der ein Objekt erstellt wurde.
updated Zeitstempel Ein Zeitstempel, der die Zeit angibt, zu der ein Objekt zuletzt aktualisiert wurde.
md5Hash Schnur Ein MD5-Hash des Objekts.
crc32c Schnur Ein crc32c-Hash des Objekts.
etag Schnur Das mit diesem Objekt verknüpfte E-Tag.
contentDisposition Schnur Die diesem Objekt zugeordnete Inhaltsdisposition.
contentEncoding Schnur Die mit diesem Objekt verknüpfte Inhaltscodierung.
contentLanguage Schnur Die mit diesem Objekt verknüpfte Inhaltssprache.
contentType Schnur Der diesem Objekt zugeordnete Inhaltstyp.
metadata map<string, string> Schlüssel/Wert-Paare zusätzlicher, vom Entwickler spezifizierter benutzerdefinierter Metadaten.

request.resource enthält alle diese mit Ausnahme der generation , metageneration , etag , timeCreated und updated .

Vollständiges Beispiel

Wenn Sie alles zusammenfassen, können Sie ein vollständiges Beispiel für Regeln für eine Bildspeicherlösung erstellen:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && request.resource.contentType == resource.contentType
                    && imageId.size() < 32
     }
   }
 }
}

Echtzeit-Datenbank

Grundstruktur

In Realtime Database bestehen Firebase-Sicherheitsregeln aus JavaScript-ähnlichen Ausdrücken, die in einem JSON-Dokument enthalten sind.

Sie verwenden die folgende Syntax:

{
  "rules": {
    "<<path>>": {
    // Allow the request if the condition for each method is true.
      ".read": <<condition>>,
      ".write": <<condition>>,
      ".validate": <<condition>>
    }
  }
}

Es gibt drei grundlegende Elemente in der Regel:

  • Pfad: Der Speicherort der Datenbank. Dies spiegelt die JSON-Struktur Ihrer Datenbank wider.
  • Request: Dies sind die Methoden, die die Regel verwendet, um den Zugriff zu gewähren. Die read und write gewähren umfassenden Lese- und Schreibzugriff, während validate als sekundäre Überprüfung dienen, um den Zugriff basierend auf eingehenden oder vorhandenen Daten zu gewähren.
  • Bedingung: Die Bedingung, die eine Anforderung zulässt, wenn sie als wahr ausgewertet wird.

So gelten Regeln für Pfade

In der Echtzeitdatenbank gelten Regeln atomar, was bedeutet, dass Regeln auf übergeordneten übergeordneten Knoten Regeln auf detaillierteren untergeordneten Knoten überschreiben und Regeln auf einem tieferen Knoten keinen Zugriff auf einen übergeordneten Pfad gewähren können. Sie können den Zugriff auf einen tieferen Pfad in Ihrer Datenbankstruktur nicht verfeinern oder widerrufen, wenn Sie ihn bereits für einen der übergeordneten Pfade gewährt haben.

Beachten Sie die folgenden Regeln:

{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          // ignored, since read was allowed already
          ".read": false
        }
     }
  }
}

Diese Sicherheitsstruktur ermöglicht das Lesen von /bar/ immer dann, wenn /foo/ ein baz mit dem Wert true . Die ".read": false Regel unter /foo/bar/ hat hier keine Wirkung, da der Zugriff nicht durch einen untergeordneten Pfad widerrufen werden kann.

Auch wenn es nicht sofort intuitiv erscheinen mag, ist dies ein mächtiger Teil der Regelsprache und ermöglicht die Implementierung sehr komplexer Zugriffsrechte mit minimalem Aufwand. Dies ist besonders nützlich für die benutzerbasierte Sicherheit .

.validate Regeln werden jedoch nicht kaskadiert. Alle Validierungsregeln müssen auf allen Ebenen der Hierarchie erfüllt sein, damit ein Schreibvorgang zulässig ist.

Da Regeln nicht wieder auf einen übergeordneten Pfad angewendet werden, schlagen außerdem Lese- oder Schreibvorgänge fehl, wenn am angeforderten Speicherort oder an einem übergeordneten Speicherort keine Regel vorhanden ist, die den Zugriff gewährt. Selbst wenn auf alle betroffenen untergeordneten Pfade zugegriffen werden kann, schlägt das Lesen am übergeordneten Speicherort vollständig fehl. Betrachten Sie diese Struktur:

{
  "rules": {
    "records": {
      "rec1": {
        ".read": true
      },
      "rec2": {
        ".read": false
      }
    }
  }
}

Ohne zu verstehen, dass Regeln atomar ausgewertet werden, könnte es so aussehen, als würde das Abrufen des /records/ rec1 aber nicht rec2 . Das eigentliche Ergebnis ist jedoch ein Fehler:

JavaScript
var db = firebase.database();
db.ref("records").once("value", function(snap) {
  // success method is not called
}, function(err) {
  // error callback triggered with PERMISSION_DENIED
});
Ziel c
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[_ref child:@"records"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
  // success block is not called
} withCancelBlock:^(NSError * _Nonnull error) {
  // cancel block triggered with PERMISSION_DENIED
}];
Schnell
var ref = FIRDatabase.database().reference()
ref.child("records").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // success block is not called
}, withCancelBlock: { error in
    // cancel block triggered with PERMISSION_DENIED
})
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // success method is not called
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback triggered with PERMISSION_DENIED
  });
});
SICH AUSRUHEN
curl https://docs-examples.firebaseio.com/rest/records/
# response returns a PERMISSION_DENIED error

Da die Leseoperation bei /records/ atomar ist und es keine PERMISSION_DENIED gibt, die Zugriff auf alle Daten unter /records/ gewährt, wird ein PERMISSION_DENIED Fehler PERMISSION_DENIED . Wenn wir diese Regel im Sicherheitssimulator in unserer Firebase-Konsole auswerten, sehen wir, dass der Lesevorgang verweigert wurde:

Attempt to read /records with auth=Success(null)
    /
    /records

No .read rule allowed the operation.
Read was denied.

Der Vorgang wurde abgelehnt, da keine rec1 den Zugriff auf den /records/ -Pfad erlaubte. Beachten Sie jedoch, dass die Regel für rec1 nie ausgewertet wurde, da sie sich nicht in dem von uns angeforderten Pfad befand. Um rec1 , müssten wir direkt darauf zugreifen:

JavaScript
var db = firebase.database();
db.ref("records/rec1").once("value", function(snap) {
  // SUCCESS!
}, function(err) {
  // error callback is not called
});
Ziel c
FIRDatabaseReference *ref = [[FIRDatabase database] reference];
[[ref child:@"records/rec1"] observeSingleEventOfType:FEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) {
    // SUCCESS!
}];
Schnell
var ref = FIRDatabase.database().reference()
ref.child("records/rec1").observeSingleEventOfType(.Value, withBlock: { snapshot in
    // SUCCESS!
})
Java
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("records/rec1");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    // SUCCESS!
  }

  @Override
  public void onCancelled(FirebaseError firebaseError) {
    // error callback is not called
  }
});
SICH AUSRUHEN
curl https://docs-examples.firebaseio.com/rest/records/rec1
# SUCCESS!

Standortvariable

Echtzeit-Datenbankregeln unterstützen eine $location Variable, um Pfadsegmenten abzugleichen. Verwenden Sie das Präfix $ vor Ihrem Pfadsegment, um Ihre Regel allen untergeordneten Knoten entlang des Pfads zuzuordnen.

  {
    "rules": {
      "rooms": {
        // This rule applies to any child of /rooms/, the key for each room id
        // is stored inside $room_id variable for reference
        "$room_id": {
          "topic": {
            // The room's topic can be changed if the room id has "public" in it
            ".write": "$room_id.contains('public')"
          }
        }
      }
    }
  }

Sie können die $variable parallel zu konstanten Pfadnamen verwenden.

  {
    "rules": {
      "widget": {
        // a widget can have a title or color attribute
        "title": { ".validate": true },
        "color": { ".validate": true },

        // but no other child paths are allowed
        // in this case, $other means any key excluding "title" and "color"
        "$other": { ".validate": false }
      }
    }
  }