Zarówno Cloud Firestore, jak i Realtime Database opierają się na potężnych, zwięzłych językach reguł stworzonych specjalnie w celu zarządzania bezpieczeństwem informacji i kontrolą dostępu. Jednakże w miarę jak reguły stają się dłuższe i bardziej złożone, możesz potrzebować pomocy w usuwaniu błędów w ich zachowaniu.
Emulatory Firebase umożliwiają generowanie raportów zasięgu reguł, dzięki czemu można dokładnie zobaczyć, do czego odnosi się każde podwyrażenie po odtworzeniu błędu. Raporty dostarczają także informacji o tym, jak często w każdym przypadku testowym stosowana była reguła, podobnie jak w przypadku tradycyjnych technik „pokrycia linii”.
Wygeneruj raport
Po przeprowadzeniu zestawu testów możesz uzyskać dostęp do raportów zasięgu testów, które pokazują, jak została oceniona każda z Twoich reguł bezpieczeństwa.
Aby uzyskać raporty, wykonaj zapytanie do odsłoniętego punktu końcowego w emulatorze, gdy jest on uruchomiony. Aby uzyskać wersję przyjazną dla przeglądarki, użyj następującego adresu URL:
Chmura Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
Baza danych czasu rzeczywistego
http://localhost:9000/.inspect/coverage?ns=<database_name>
Spowoduje to rozbicie reguł na wyrażenia i podwyrażenia, na które można najechać myszką, aby uzyskać więcej informacji, w tym liczbę ocen i zwróconych wartości. Aby uzyskać surową wersję tych danych w formacie JSON, w zapytaniu umieść następujący adres URL:
Chmura Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
Baza danych czasu rzeczywistego
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
Debugowanie przykładowych reguł
Aby łatwo wygenerować raport z testu, skorzystaj z przewodników Szybki start dotyczących emulatora dostępnych w GitHub dla Cloud Firestore i Realtime Database . Te przewodniki Szybki start przeprowadzą Cię przez prawidłową instalację i inicjalizację emulatorów, a następnie wygenerowanie 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ęli przycisk. W aplikacji obowiązują następujące zasady:
Chmura 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 następującego przykładowego testu 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 pokazuje następujące niezdefiniowane błędy o wartości zerowej:
Problem z tym konkretnym przykładem polega na tym, że reguły nie rozróżniają między tworzeniem dokumentu a jego aktualizacją. 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 dwie bardziej szczegółowe operacje — „utwórz” i „aktualizację” — rozwiązuje problem.
Chmura 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 dana reguła była używana i co zostało zwrócone.