Firebase安全规则配置:如何禁止guides节点的写入权限
解决Firebase规则中父节点权限覆盖子节点的问题
嗨,这个问题我之前也帮人处理过,核心是Firebase安全规则的匹配优先级在搞鬼:如果你在父节点(比如顶层)直接设置了允许所有读写,Firebase会优先匹配这个规则,根本不会往下检查子节点的限制,所以你的guides节点规则自然就不生效了。
要解决这个问题,你需要调整规则写法,让子节点的特殊规则先被匹配,同时给其他节点设置默认允许权限,而不是在顶层直接开全权限。下面分两种场景给你具体的规则示例:
场景1:明确知道所有其他节点的名称
如果你的数据库里只有几个固定节点(比如users、posts、guides),可以直接逐个配置:
Firestore规则
service cloud.firestore { match /databases/{database}/documents { // 允许users节点全读写权限 match /users/{userId} { allow read, write: if true; } // 允许posts节点全读写权限 match /posts/{postId} { allow read, write: if true; } // 单独限制guides:只允许读,禁止写 match /guides/{guideId} { allow read: if true; allow write: if false; } } }
Realtime Database规则
{ "rules": { // 先关闭顶层默认权限 ".read": false, ".write": false, // 给其他节点开全权限 "users": { ".read": true, ".write": true }, "posts": { ".read": true, ".write": true }, // 单独设置guides的权限 "guides": { ".read": true, ".write": false } } }
场景2:节点数量多,不想逐个配置
如果你的数据库节点很多,可以用通配符$other匹配除guides之外的所有节点,再单独设置guides的规则:
Firestore规则
service cloud.firestore { match /databases/{database}/documents { // 匹配所有顶层节点,除guides外都允许读写 match /{$other} { allow read, write: if $other != 'guides'; } // 单独限制guides节点 match /guides/{guideId} { allow read: if true; allow write: if false; } } }
Realtime Database规则
{ "rules": { // 匹配所有节点,除guides外允许读写 "$other": { ".read": "$other != 'guides'", ".write": "$other != 'guides'" }, // 单独设置guides的权限 "guides": { ".read": true, ".write": false } } }
关键注意点
- 绝对不要在顶层直接设置
allow read, write: true;(Firestore)或者.read/.write: true(Realtime Database),这会直接覆盖所有子节点的规则 - Firebase规则是优先匹配最具体的路径,所以一定要把特殊节点的规则放在前面,或者用条件判断排除
- 写完规则后,记得用Firebase控制台的规则模拟器测试一下,确保
guides节点确实无法写入,其他节点正常读写
内容的提问来源于stack exchange,提问作者Nirel
相关产品推荐
相关产品推荐

