Cloud Firestore i Realtime Database korzystają z zaawansowanych, zwięzłych języków reguł które zostały stworzone specjalnie do zarządzania bezpieczeństwem informacji i kontrolą dostępu. Jednak w przypadku dłuższych i bardziej złożonych reguł możesz potrzebować pomocy w debugowaniu błędów w ich działaniu.
Emulatory Firebase umożliwiają generowanie raportów o pokryciu reguł, dzięki czemu możesz dokładnie sprawdzić, do czego została zredukowana każda podwyrażenie podczas odtwarzania błędu. Raporty zawierają też informacje o tym, jak często każdy przypadek testowy używał reguły, podobnie jak w przypadku tradycyjnych technik „pokrycia kodu”.
Wygeneruj raport
Po uruchomieniu pakietu testów możesz uzyskać dostęp do raportów o pokryciu testów, które pokazują, jak oceniana była każda z Twoich reguł bezpieczeństwa.
Aby uzyskać raporty, wyślij zapytanie do udostępnionego punktu końcowego w emulatorze podczas jego działania. Aby uzyskać wersję przyjazną dla przeglądarki, użyj tego adresu URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Realtime Database
http://localhost:9000/.inspect/coverage?ns=<database_name>
Reguły są dzielone na wyrażenia i podwyrażenia, nad którymi możesz najechać kursorem, aby uzyskać więcej informacji, w tym liczbę ocen i zwrócone wartości. Aby uzyskać wersję tych danych w formacie JSON, dodaj do zapytania ten adres URL:
Cloud Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Realtime Database
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Przykłady debugowania reguł
Aby łatwo wygenerować raport z testu, użyj szybkich przewodników po emulatorze dostępnych na GitHubie w przypadku Cloud Firestore i Realtime Database. Te szybkie przewodniki przeprowadzą Cię przez proces prawidłowej instalacji i inicjowania emulatorów, a następnie wygenerowania przykładowych testów na podstawie przykładowego zestawu reguł.
Rozważmy przykładową aplikację korzystającą z Cloud Firestore, która zlicza, ile razy użytkownicy klikną przycisk. Aplikacja korzysta z tych reguł:
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; } } }
Aby debugować błędy w regułach pokazanych powyżej, użyj tego przykładowego testu w JavaScript:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
Emulator generuje raport dostępny pod adresem URL podanym powyżej:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Raport zawiera te błędy wartości niezdefiniowanych i null:

Problem z tym konkretnym przykładem polega na tym, że reguły nie rozróżniają tworzenia dokumentu od jego aktualizowania. W związku z tym zapis nie jest dozwolony, jeśli dokument nie istnieje, a dokumentu nie można utworzyć, ponieważ nie istnieje. Rozróżnienie „zapisu” na 2 bardziej szczegółowe operacje – „utwórz” i „zaktualizuj” – rozwiązuje ten problem.
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; } } }
Wygenerowany raport pokazuje, jak często używana była każda reguła i co zostało zwrócone.
