Firebase database.rules.json中service节点位置及Firestore规则配置问题
1. 关于service元素的位置与原有规则的适用范围
首先得明确:你手里的database.rules.json是Firebase实时数据库的专属规则文件,这个文件里根本不需要service元素——service是Cloud Firestore规则的顶层专属结构,和实时数据库的规则体系完全是两回事。
你提供的原有规则:
{ "rules": { ".read": "auth != null", ".write": "auth != null", } }
这是实时数据库的标准JSON格式规则,只对实时数据库生效,完全不适用于Cloud Firestore。Firestore有自己独立的规则语法和结构,和实时数据库的规则不通用。
2. Firestore规则的存储与同步问题
先给你划重点:Cloud Firestore的规则不能直接塞进database.rules.json里,两者必须用独立的文件存储,因为Firebase CLI对这两个服务的规则文件有明确区分:
- 实时数据库规则默认对应
database.rules.json - Cloud Firestore规则默认对应
firestore.rules(纯文本格式,不是JSON)
不过如果你想统一做版本控制,也可以通过firebase.json自定义规则文件路径,但绝对不建议把两种规则混在同一个JSON文件里——Firestore规则是类JavaScript的语法,和实时数据库的JSON结构冲突,会直接导致部署失败。
正确的同步&部署方式:
单独存放Firestore规则:把你提供的Firestore规则保存为
firestore.rules纯文本文件,顺便帮你修正了一处语法错误(原规则里user.id是错的,{user}变量直接代表文档ID):service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } match /photos { allow read, write: if request.auth != null; } match /users/{user} { allow read: if request.auth != null; allow write: if request.auth.uid == user; } } }通过
firebase.json统一配置:在项目根目录的firebase.json里指定两个服务的规则路径,这样CLI就能正确识别:{ "database": { "rules": "database.rules.json" }, "firestore": { "rules": "firestore.rules" } }之后你只需执行
firebase deploy --only database,firestore命令,就能同时部署两个服务的规则,轻松实现版本控制和自动部署的需求。
为什么不能把Firestore规则放到database.rules.json?
- 实时数据库规则是严格的JSON格式,Firestore规则是基于Security Rules语言的纯文本语法,两者结构、语法完全不兼容,混放会被CLI判定为无效配置。
- Firebase CLI会分别读取对应服务的规则文件,强行混放无法被正确解析,部署必然失败。
总结
service元素是Firestore规则的专属顶层结构,只出现在Firestore的规则文件中,实时数据库的database.rules.json不需要它。- 你原来的规则仅适用于实时数据库,和Firestore没有任何关联。
- Firestore规则必须单独存储(默认
firestore.rules),不能放到database.rules.json里,通过firebase.json配置后可实现统一版本控制和部署。
内容的提问来源于stack exchange,提问作者MonkeyBonkey

