Firebase实时数据库规则游乐场测试失败,但实际写入正常
Firebase实时数据库规则游乐场测试异常问题
背景
我正在测试以下Firebase实时数据库规则(非Firestore):
{ "rules": { "tariffs": { "$uid": { ".read": "auth != null && auth.token.email_verified == true", ".write": "auth != null && auth.token.email_verified == true && (!data.exists() || auth.uid === $uid)" } } } }
规则预期效果:
- 已验证邮箱的认证用户可读取任意
$uid节点下的tariffs数据 - 仅允许已验证邮箱的认证用户写入与自身uid匹配的
$uid节点,或创建新节点
当前tariffs节点下仅存一条数据,对应数据库路径为tariffs/-NekhNFj-Ns56mvBj7IG。
问题
在规则游乐场测试时,get、set、update、delete操作均被拒绝,但实际场景中我能正常写入tariffs节点。测试用户的uid(k5Lh1hfvSwSmNaKfqh4yfl6tsof2)与目标数据节点的uid一致。
编辑记录
- 2023年9月22日19:24 GMT:尝试引用推送ID节点的子节点时出现语法错误
- 2023年9月23日6:37 GMT:修正规则语法后,读写操作仍被拒绝
我是否忽略了某些明显问题?为何测试用户在规则游乐场无法读写自身数据?
问题排查与解决方向
数据结构与规则层级不匹配
你的规则中$uid是tariffs的直接子节点,但实际数据路径里的-NekhNFj-Ns56mvBj7IG是Firebase自动生成的推送ID,并非用户uid。规则会把这个推送ID当作$uid来匹配,而你的测试用户uid是k5Lh1hfvSwSmNaKfqh4yfl6tsof2,两者不匹配,自然触发规则拒绝。
实际场景能写入,大概率是代码中直接向tariffs节点写入(自动生成推送ID),但这和规则里期望的「子节点为用户uid」的结构完全不符。规则游乐场的Auth配置遗漏
检查规则游乐场的测试配置:- 是否勾选了「已认证用户」选项
- 是否将
auth.token.email_verified设为true - 是否准确填写了测试用户的uid:
k5Lh1hfvSwSmNaKfqh4yfl6tsof2
调整规则或数据结构
如果你的设计是「用户uid作为tariffs的直接子节点,下放推送ID数据」,那需要修正数据写入路径,把数据写到tariffs/[用户uid]/下;如果实际结构是tariffs/[推送ID]/[用户uid]/...,则要调整规则层级:{ "rules": { "tariffs": { "$pushId": { "$uid": { ".read": "auth != null && auth.token.email_verified == true", ".write": "auth != null && auth.token.email_verified == true && (!data.exists() || auth.uid === $uid)" } } } } }
内容的提问来源于stack exchange,提问作者JKxbt33
相关产品推荐
相关产品推荐

