Firebase Realtime安全规则uid与叶子节点值对比失败如何解决?
核心问题原因
Firebase 实时数据库的权限校验遵循规则向下级联、权限不向上传递的原则,且会在你发起请求的路径层级第一时间完成校验:
你当前的代码直接监听了 /Usuarios 根路径,但你的规则中仅在 /Usuarios/$usuarioPk 子路径配置了读权限,父路径 /Usuarios 没有任何读权限配置,所以请求刚到 /Usuarios 层级就直接被拒绝,根本不会触发子节点的权限校验逻辑。
另外还需要检查拼写问题:你描述的数据结构路径写的是 (root/)Usuaros/$userid,但规则中写的是 Usuarios,如果实际路径拼写和规则不匹配也会导致权限失效。
解决方案
方案1:直接查询当前用户的子节点(推荐,性能最优)
如果你的 $usuarioPk 就是用户 Auth 的 UID,直接修改请求路径为对应用户的子节点即可:
- 先获取当前登录用户的 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>(); } }
- 原有规则不需要修改,请求子节点时会自动触发子节点的权限校验。
方案2:通过条件查询过滤数据(适用于 $usuarioPk 不是 Auth UID 的场景)
如果你需要通过查询匹配 uid 字段获取对应用户的数据,需要给父节点补充查询权限和索引:
- 修改数据库规则如下:
{ "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" } } } }
- 修改监听逻辑,改为带条件的查询:
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
相关产品推荐
相关产品推荐

