我们正在开发基于Cloud Firestore的Android应用。
现在,我们已经将该应用程序发布到生产环境中,并且我们将继续添加更多功能,这些更改迫使我们添加/更改Firestore安全规则。
问题是如何在将规则发布给所有用户之前如何使用新的安全规则测试应用程序?
我在文档中看到Firestore有一些模拟器,但是我不知道他是否可以提供帮助或仅用于单元测试,还有一个模拟器可以在草稿模式下测试单个请求,但是最终我们需要测试应用程序的功能手动。
换句话说,是否有一种方法可以更改安全规则并在将其应用到所有用户之前对其进行测试?
[我也对在生产中使用Firebase的人有疑问:
也许我缺少有关Firestore的重要信息。
提前感谢。
您可能希望研究Firebase模拟器(Beta)以测试安全规则:
Firebase模拟器
Firebase模拟器使轻松完成验证您应用的行为并验证Firebase安全规则配置。使用Firebase模拟器来运行和自动化单元在本地环境中进行测试。
样本测试:
firebase.assertFails(app.firestore().collection("private").doc("super-secret-document").get());
assertFails(pr: Promise) => Promise
此方法返回一个promise,如果输入成功,则将被拒绝或如果输入被拒绝则成功。使用此断言是否数据库读取或写入失败。
我使用了Bolt,它是可转换为JSON安全规则的超集。与通过Firebase UI使用标准规则和模拟器相比,这似乎是一个更好的选择,尤其是当规则随着应用程序的增长而变得又大又复杂时,因为Bolt允许您创建函数以将通用代码重复用于读/写/验证逻辑。
螺栓文档:
https://github.com/FirebaseExtended/bolt/blob/master/docs/guide.md
测试说明
https://github.com/FirebaseExtended/bolt/issues/80
还回答了我们的问题,给出了详细说明here,以支持针对您的开发和生产环境的单独Firebase项目。
[不幸的是,我没有找到官方的解决方案,我使用前缀dev-
将安全规则划分为开发和生产,并将数据库划分为开发和生产,因此调试模式可与开发数据库一起使用并匹配开发安全规则。当然,在运行时需要为每个根集合添加前缀。
这样,我可以在不影响生产的情况下发布对开发模式的新更改,我都可以正常工作,我可以将规则从开发复制到生产中,并删除`dev'前缀。
service cloud.firestore { match /databases/{database}/documents {
//production rules ********************************************************************
match /data/{user}/{doc=**} {
allow read, write: if request.auth.uid == user || hasPerrmision(request.auth.token.email);
//development rules ********************************************************************
match /dev-data/{user}/{doc=**} {
allow read, write: if request.auth.uid == user || hasPerrmision(request.auth.token.email);
}
}
}