Sowohl Cloud Firestore als auch Realtime Database basieren auf leistungsstarken, prägnanten Regelsprachen, die speziell für die Informationssicherheit und Zugriffssteuerung entwickelt wurden. Wenn Regeln jedoch länger und komplexer werden, benötigen Sie möglicherweise Hilfe bei der Fehlerbehebung.
Mit den Firebase-Emulatoren können Sie Berichte zur Regelabdeckung generieren. So sehen Sie genau, wie die einzelnen Unterausdrücke ausgewertet wurden, wenn Sie einen Fehler reproduzieren. Die Berichte enthalten auch Informationen dazu, wie oft in jedem Testfall eine Regel verwendet wurde, z. B. traditionelle Techniken zur „Zeilenabdeckung“.
Bericht generieren
Nachdem Sie eine Reihe von Tests ausgeführt haben, können Sie auf Berichte zur Testabdeckung zugreifen, die Aufschluss darüber geben, wie die einzelnen Sicherheitsregeln bewertet wurden.
Um die Berichte abzurufen, fragen Sie einen bereitgestellten Endpunkt im Emulator ab, während er ausgeführt wird. Verwenden Sie für eine browserfreundliche Version die folgende URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
Dadurch werden Ihre Regeln in Ausdrücke und Teilausdrücke aufgeteilt. Bewegen Sie die Maus auf einen Ausdruck oder Teilausdruck, um weitere Informationen zu erhalten, einschließlich der Anzahl der Bewertungen und der zurückgegebenen Werte. Fügen Sie für die JSON-Rohversion dieser Daten die folgende URL in Ihre Abfrage ein:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Beispielregeln für das Debugging
Wenn Sie ganz einfach einen Testbericht generieren möchten, verwenden Sie die Emulator-Kurzanleitungen, die auf GitHub für Cloud Firestore und Realtime Database verfügbar sind. In diesen Kurzanleitungen erfahren Sie, wie Sie die Emulatoren richtig installieren und initialisieren und dann Beispieltests aus einem Beispielsatz von Regeln generieren.
Angenommen, Sie verwenden Cloud Firestore in einer Beispiel-App, um zu zählen, wie oft Nutzer auf eine Schaltfläche klicken. Die App verwendet die folgenden Regeln:
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
Verwenden Sie den folgenden JavaScript-Test, um die Fehler in den oben gezeigten Regeln zu beheben:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
Der Emulator generiert einen Bericht, der unter der oben genannten URL verfügbar ist:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Der Bericht enthält die folgenden Fehler bei nicht definierten und Nullwerten:
Das Problem bei diesem Beispiel ist, dass die Regeln nicht zwischen dem Erstellen und dem Aktualisieren des Dokuments unterscheiden. Daher ist das Schreiben nicht zulässig, wenn das Dokument nicht vorhanden ist, und das Dokument kann nicht erstellt werden, da es nicht vorhanden ist. Wenn Sie „write“ in zwei spezifischere Vorgänge unterteilen, nämlich „create“ und „update“, lässt sich das Problem beheben.
Cloud Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow create: if request.resource.data.value == 0; allow update: if request.resource.data.value == resource.data.value +1; } } }
Der generierte Bericht zeigt, wie oft die einzelnen Regeln verwendet wurden und was zurückgegeben wurde.