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

Firebase Realtime安全规则uid与叶子节点值对比失败如何解决?

核心问题原因

Firebase 实时数据库的权限校验遵循规则向下级联、权限不向上传递的原则,且会在你发起请求的路径层级第一时间完成校验:
你当前的代码直接监听了 /Usuarios 根路径,但你的规则中仅在 /Usuarios/$usuarioPk 子路径配置了读权限,父路径 /Usuarios 没有任何读权限配置,所以请求刚到 /Usuarios 层级就直接被拒绝,根本不会触发子节点的权限校验逻辑。

另外还需要检查拼写问题:你描述的数据结构路径写的是 (root/)Usuaros/$userid,但规则中写的是 Usuarios,如果实际路径拼写和规则不匹配也会导致权限失效。


解决方案

方案1:直接查询当前用户的子节点(推荐,性能最优)

如果你的 $usuarioPk 就是用户 Auth 的 UID,直接修改请求路径为对应用户的子节点即可:

  1. 先获取当前登录用户的 UID,修改 TablaUsuarios 的路径配置:
protected override void OnEnable()
{
    base.OnEnable();
    var currentUser = Firebase.Auth.FirebaseAuth.DefaultInstance.CurrentUser;
    if (currentUser == null) {
        // 自行补充未登录的异常处理逻辑
        return;
    }
    // 直接指定到当前用户的子节点路径
    dbPath = $"Usuarios/{currentUser.UserId}";
    if(usuarios == null)
    {
        usuarios = new List<Usuario>();
    }
}
  1. 原有规则不需要修改,请求子节点时会自动触发子节点的权限校验。

方案2:通过条件查询过滤数据(适用于 $usuarioPk 不是 Auth UID 的场景)

如果你需要通过查询匹配 uid 字段获取对应用户的数据,需要给父节点补充查询权限和索引:

  1. 修改数据库规则如下:
{
  "rules": {     
    "Usuarios" :{ 
      // 给uid字段加索引提升查询性能
      ".indexOn": "uid",
      // 仅允许按uid字段查询等于当前登录用户uid的请求通过
      ".read": "auth != null && query.orderByChild == 'uid' && query.equalTo == auth.uid",     
      "$usuarioPk" : {
        ".read": "data.child('uid').val() == auth.uid"
      }
    }
  }
}
  1. 修改监听逻辑,改为带条件的查询:
void IniciarListenerDB()
{
    var currentUser = Firebase.Auth.FirebaseAuth.DefaultInstance.CurrentUser;
    if (currentUser == null) {
        // 自行补充未登录的异常处理逻辑
        return;
    }
    FirebaseDatabase.DefaultInstance
        .GetReference(dbPath)
        // 按uid字段匹配当前登录用户的uid
        .OrderByChild("uid")
        .EqualTo(currentUser.UserId)
        .ValueChanged += HandleValueChanged;
}

额外注意

所有数据库请求必须在用户完成 Firebase Auth 登录之后发起,未登录状态下 auth 变量为 null,所有需要登录的请求都会被拒绝。

内容的提问来源于stack exchange,提问作者Iroqas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:57:05