Cloud Firestore 和實時數據庫都依賴於專門為管理信息安全和訪問控製而創建的強大、簡潔的規則語言。但是,隨著規則變得越來越長和越來越複雜,您可能需要一些幫助來調試其行為中的錯誤。
Firebase 模擬器包括生成規則覆蓋率報告的功能,因此您可以準確地看到每個子表達式在重現錯誤時的計算結果。這些報告還提供有關每個測試用例使用規則的頻率的信息,例如傳統的“線路覆蓋”技術。
生成報告
運行一套測試後,您可以訪問測試覆蓋率報告,其中顯示瞭如何評估每個安全規則。
要獲取報告,請在模擬器運行時查詢公開的端點。對於瀏覽器友好的版本,請使用以下 URL:
雲端 Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
實時數據庫
http://localhost:9000/.inspect/coverage?ns=<database_name>
這會將您的規則分解為表達式和子表達式,您可以將鼠標懸停在它們上以獲取更多信息,包括計算次數和返回值。對於此數據的原始 JSON 版本,請在查詢中包含以下 URL:
雲端 Firestore
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
實時數據庫
http://localhost:9000/.inspect/coverage.json?ns=<database_name>
調試示例規則
要輕鬆生成測試報告,請使用 GitHub 上提供的適用於Cloud Firestore和實時數據庫的模擬器快速入門。這些快速入門將指導您正確安裝和初始化模擬器,然後根據一組示例規則生成示例測試。
考慮一個使用 Cloud Firestore 的示例應用程序,該應用程序計算用戶點擊按鈕的次數。該應用程序採用以下規則:
雲端 Firestore
service cloud.firestore { match /databases/{database}/documents { match /counters/{counter} { allow read; allow write: if request.resource.data.value == resource.data.value +1; } } }
要調試上面顯示的規則中的錯誤,請使用以下示例 JavaScript 測試:
const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));
模擬器會生成一份報告,該報告可在上述 URL 中找到:
http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
該報告顯示以下未定義和空值錯誤:
這個具體示例的問題在於規則不區分創建文檔和更新文檔。因此,如果文檔不存在,則不允許寫入,並且無法創建文檔,因為它不存在。將“寫入”區分為兩個更具體的操作——“創建”和“更新”——解決了這個問題。
雲端 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; } } }
生成的報告顯示每條規則的使用頻率和返回的內容。