Firebase实时数据库规则:子节点访问父级$cliente变量失败
Firebase Realtime Database 规则变量匹配权限问题解决
问题核心
你尝试通过auth.token.place == $cliente限制仅同组用户写入chats节点,但该对比始终失败——常量对比(如auth.token.place == 23)有效,变量对比无效,写入操作返回PERMISSION DENIED。
根本原因
Firebase Realtime Database的规则中,路径变量$cliente会被解析为字符串类型,而你的auth.token.place大概率是数字类型(从数据结构中clientes节点为数字ID可推测)。由于规则对类型匹配要求严格,字符串与数字直接对比会返回false,导致权限校验失败。
解决方案
将两者统一为相同类型后再对比,以下两种方式任选其一:
方式1:将$cliente转为数字
如果auth.token.place是数字类型,把路径变量转成数字后对比:
{ "rules": { "clientes" : { "$cliente" : { "tvs" : { ".read": true, ".write": false }, "chats" : { ".read": true, ".write": "auth !== null && auth.token.place == parseInt($cliente)" } } } } }
方式2:将auth.token.place转为字符串
如果auth.token.place是字符串类型,或者你想统一用字符串对比:
{ "rules": { "clientes" : { "$cliente" : { "tvs" : { ".read": true, ".write": false }, "chats" : { ".read": true, ".write": "auth !== null && String(auth.token.place) == $cliente" } } } } }
额外验证步骤
- 用Firebase控制台的规则模拟器测试:模拟
auth.token.place为对应类型的值,验证写入权限是否通过。 - 确认写入代码中的
id变量是否正确对应目标$cliente节点,避免路径错误导致的权限问题。
内容的提问来源于stack exchange,提问作者Guilherme Simão Couto
相关产品推荐
相关产品推荐

