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; } } }
生成的报告显示每条规则的使用频率和返回的内容。