Firebase实时数据库三类用户分组权限安全规则配置问询
Firebase Realtime Database 分级数据访问权限配置方案
问题原因
原有规则无法生效的核心原因有两个:
- 硬编码UID版本将固定字符串
user_uid作为节点键查询,仅能匹配UID恰好为该字符串的单个用户 - 遍历版本不符合安全规则语法:Realtime Database安全规则不支持遍历全量子节点做匹配,不存在
children().keys()这类链式查询方法,且遍历全节点的逻辑本身性能极差,不符合安全规则的设计逻辑。
安全规则不需要做节点遍历:内置全局变量auth.uid会自动注入当前发起请求的已登录用户UID,直接用该变量定位当前用户在users节点下的status字段做校验,即可自动对所有登录用户完成身份匹配。
正确可用的安全规则
{ "rules": { // 根节点默认拒绝所有未明确授权的读写,从源头避免越权 ".read": false, ".write": false, "data_prenium": { ".read": "auth != null && root.child('users').child(auth.uid).child('status').val() === 'prenium'", // 如需开放该节点写权限,保留下方配置即可,不需要可以删除 ".write": "auth != null && root.child('users').child(auth.uid).child('status').val() === 'prenium'" }, "data_access": { ".read": "auth != null && root.child('users').child(auth.uid).child('status').val() === 'access'", ".write": "auth != null && root.child('users').child(auth.uid).child('status').val() === 'access'" }, "data_free": { ".read": "auth != null && root.child('users').child(auth.uid).child('status').val() === 'free'", ".write": "auth != null && root.child('users').child(auth.uid).child('status').val() === 'free'" }, "users": { "$userId": { // 保留原有逻辑:用户仅能读写自身的个人信息节点 ".read": "auth != null && $userId === auth.uid", ".write": "auth != null && $userId === auth.uid" } } } }
关键注意事项
- 所有权限判断前必须加
auth != null校验,拦截未登录的匿名访问,避免未登录用户触发规则时出现空指针报错 - 请保证规则里的status字符串和你存储在
users/{uid}/status下的字段值完全一致,拼写、大小写偏差都会导致校验失败。如果你是笔误把premium写成了prenium,请同步修改两边的取值 - Realtime Database规则遵循"上层授权覆盖下层限制"的逻辑,不要在根节点或上层节点加宽松的读写权限,当前配置在根节点默认拒绝所有请求,仅在对应分级节点给符合身份的用户开放权限,不会出现越权访问问题。
内容的提问来源于stack exchange,提问作者koper92
相关产品推荐
相关产品推荐

