如何正确配置Firebase多级账户访问读写权限规则
Firebase实时数据库权限规则修复方案
现有结构与需求
数据库结构
{ "agencies": { "a7x6BwW2GDb34sZYiLSDpzApNw03": { "businessInfo": {}, "clients": { "V33meLCYD0Q3NATokZNBTxIH1jr2": { "businessInfo": {} }, "uRj7uSjVfxNhwG2J5geTlkUUBtC3": { "businessInfo": {} } } }, "b5riE7yoQEhWabFQn4ZKixTS5513": { "businessInfo": {}, "clients": { "A0EwYmU9PLWqnJNIJJ7bvAmvn0F2": { "businessInfo": {} }, "XO43avp90NNKo9aQSSilk0pjDvv1": { "businessInfo": {} } } } } }
权限控制要求
- 每个代理商(Agency)拥有其名下所有客户Business Info的读写权限
- 每个客户(Client)仅拥有自身Business Info的读写权限
补充说明:所有代理商和客户均持有独立登录账号,拥有独立的账户访问权限。
原有规则缺陷
原有规则存在两个核心问题:
- 路径变量命名冲突:agencies层级和clients层级的动态节点都命名为
$uid,下层变量会覆盖上层变量,导致规则无法获取当前客户所属的代理商ID - 客户节点的读写规则仅校验了客户自身ID,没有加入所属代理商的权限判断,导致代理商访问名下客户数据时被拦截
原有规则代码:
{ "rules": { "agencies": { "$uid": { "businessInfo": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" }, "clients": { "$uid": { "businessInfo": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } } } } }
正确规则配置
{ "rules": { "agencies": { "$agencyId": { "businessInfo": { ".read": "$agencyId === auth.uid", ".write": "$agencyId === auth.uid" }, "clients": { "$clientId": { "businessInfo": { ".read": "auth.uid === $agencyId || auth.uid === $clientId", ".write": "auth.uid === $agencyId || auth.uid === $clientId" } } } } } } }
规则说明
- 重命名动态路径变量区分身份:agencies层级动态节点命名为
$agencyId对应当前路径的代理商ID,clients层级动态节点命名为$clientId对应当前路径的客户ID,从根源解决变量覆盖问题 - 客户业务信息节点的读写规则采用或逻辑判断:满足「当前登录用户是所属代理商」、「当前登录用户是客户本人」两个条件任意一个,即可获得对应节点的读写权限
- 代理商自身的businessInfo节点权限保持不变,仅代理商本人可读写
测试验证
使用提供的测试请求验证:
- 测试登录用户uid:
a7x6BwW2GDb34sZYiLSDpzApNw03(代理商身份) - 访问路径:
/agencies/a7x6BwW2GDb34sZYiLSDpzApNw03/clients/V33meLCYD0Q3NATokZNBTxIH1jr2/businessInfo - 规则校验逻辑:路径中
$agencyId值为a7x6BwW2GDb34sZYiLSDpzApNw03,与当前登录用户uid完全匹配,请求会被正常放行,符合预期。
内容的提问来源于stack exchange,提问作者camdev
相关产品推荐
相关产品推荐

