You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:48:22