Firebase实时数据库N2N关系规则写入失败排查求助
问题原因与解决方案
核心问题:路径引用错误
你的规则阻止写入的关键原因是**newData的路径使用错误**:
在condominios_usuarios/$idCondominio的.write规则中,newData指向的是当前$idCondominio节点更新后的数据集,而非整个数据库的根节点。你写的newData.child('condominios_usuarios')相当于在condominios_usuarios/$idCondominio/condominios_usuarios这个不存在的路径下查找数据,必然返回false,导致规则校验失败。
修正后的规则
针对你的业务场景(创建小区时同时关联用户权限),调整后的规则如下:
{ "rules": { "usuarios_condominios": { ".read" : "auth.uid != null", "$idUsuario": { ".write": "(auth.uid === $idUsuario) || (root.child('usuarios').child(auth.uid).child('ehAdmin').val() == true)" } }, "condominios_usuarios": { ".read" : "auth.uid != null", "$idCondominio": { ".write": "auth.uid != null && ( // 允许全局管理员操作 root.child('usuarios').child(auth.uid).child('ehAdmin').val() == true || // 允许用户写入自己在该小区的权限记录 newData.child(auth.uid).exists() || // 允许该小区的现有管理员修改权限 root.child('condominios_usuarios').child($idCondominio).child(auth.uid).child('ehAdmin').exists() )" } } } }
修正说明
- 移除了错误的
newData.child('condominios_usuarios')路径引用; - 保留全局管理员的权限逻辑,和
usuarios_condominios规则保持一致; - 新增
newData.child(auth.uid).exists()判断,允许用户创建新小区时写入自己的权限记录,适配你的Java代码逻辑; - 保留小区现有管理员的修改权限,支持后续权限管理操作。
由于你使用updateChildren进行原子更新,修正后的规则会同时校验所有写入节点,确保创建小区时的权限关联操作能正常执行。
内容的提问来源于stack exchange,提问作者Ilian Felinto
相关产品推荐
相关产品推荐

