Firebase实时数据库安全规则配置报错及读写权限问题求助
Firebase实时数据库规则解决方案
数据结构参考
先明确高分数据的存储结构(可根据你的游戏需求调整):
{ "highscores": { "level_1": { "user_xyz789": { "score": 920, "timestamp": 1695000000, "userId": "user_xyz789" } } }, "admins": { "admin_123xyz": true // 存储管理员UID,值设为true即可 } }
符合需求的规则配置
替换你的数据库规则为以下代码,可直接解决「特殊字符报错」和「读写权限问题」:
{ "rules": { "highscores": { ".read": true, // 全员可读 "$levelId": { "$userId": { ".write": " // 全员新增数据:仅当数据不存在,且结构合法时允许 (!data.exists() && auth != null && newData.hasChildren(['score', 'timestamp', 'userId']) && newData.child('score').isNumber() && newData.child('score').val() > 0 && newData.child('timestamp').isNumber() && newData.child('userId').val() === $userId ) || // 仅管理员可修改已有数据 (data.exists() && root.child('admins').child(auth.uid).exists()) " } } }, "admins": { ".read": false, ".write": "root.child('admins').child(auth.uid).exists()" // 仅现有管理员可添加新管理员 } } }
问题排查与修复
「字符串不能包含特殊字符」报错修复
- 规则中所有字符串必须用双引号包裹,禁止使用单引号
- 若需在字符串内嵌套双引号,要加反斜杠转义(例:
"提示:\"分数必须为正整数\"") - 正则表达式中的特殊字符(如
^、$)无需额外转义,直接写在双引号内即可
应用无法读写问题修复
- 认证检查:规则中新增数据要求
auth != null,确保你的游戏已集成Firebase认证(匿名登录、邮箱登录均可),未认证用户无法新增数据 - 数据结构校验:新增高分时必须传入
score(正整数)、timestamp(时间戳数字)、userId(与节点路径的$userId一致),缺少字段或类型错误会被规则拦截 - 管理员权限:修改已有数据前,需将操作用户的UID添加到
admins节点中,否则会被拒绝 - 模拟器测试:用Firebase控制台的「规则模拟器」分别测试普通用户、管理员的读写操作,快速定位权限拒绝的具体原因
测试场景验证
- 普通认证用户:可读取所有关卡高分,可新增自己的高分记录,无法修改任何已有数据
- 管理员用户:可读取、新增、修改任意关卡的任意高分记录
- 未认证用户:仅能读取数据,无法新增或修改
内容的提问来源于stack exchange,提问作者VanessaF
相关产品推荐
相关产品推荐

