You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:修正规则语法后,读写操作仍被拒绝

我是否忽略了某些明显问题?为何测试用户在规则游乐场无法读写自身数据?


问题排查与解决方向

  1. 数据结构与规则层级不匹配
    你的规则中$uid是tariffs的直接子节点,但实际数据路径里的-NekhNFj-Ns56mvBj7IG是Firebase自动生成的推送ID,并非用户uid。规则会把这个推送ID当作$uid来匹配,而你的测试用户uid是k5Lh1hfvSwSmNaKfqh4yfl6tsof2,两者不匹配,自然触发规则拒绝。
    实际场景能写入,大概率是代码中直接向tariffs节点写入(自动生成推送ID),但这和规则里期望的「子节点为用户uid」的结构完全不符。

  2. 规则游乐场的Auth配置遗漏
    检查规则游乐场的测试配置:

    • 是否勾选了「已认证用户」选项
    • 是否将auth.token.email_verified设为true
    • 是否准确填写了测试用户的uid:k5Lh1hfvSwSmNaKfqh4yfl6tsof2
  3. 调整规则或数据结构
    如果你的设计是「用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:32:21