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

Firebase Admin SDK用服务账户访问实时数据库遇权限拒绝问题

解决Firebase Admin SDK访问实时数据库的PERMISSION_DENIED错误

问题根源

你遇到的权限拒绝问题,核心原因有两个:

  1. 数据库规则层级错误:你的TEST_ADMIN节点本身未定义.read权限,仅子节点$uid配置了权限。当直接读取/TEST_ADMIN/时,Firebase会优先校验父节点的权限规则,未配置规则的节点默认拒绝访问。
  2. Admin SDK身份模拟触发规则检查:你启用了databaseAuthVariableOverride模拟admin用户身份,这会让Admin SDK不再绕过安全规则,而是以普通用户身份触发规则校验,进一步暴露了规则的层级问题。

解决方案

方案1:修正数据库规则,给父节点添加权限

修改TEST_ADMIN的规则,为父节点添加对应的.read权限,确保读取父节点时能通过规则校验:

{
  "rules": {
    // 保留其他原有规则
    "TEST_ADMIN": {
      // 给父节点添加read权限,允许admin用户访问
      ".read": "auth !== null && auth.uid === 'admin'",
      ".write": "auth !== null && auth.uid === 'admin'",
      "$uid": {
        ".read": "auth !== null",
        ".write": "auth !== null"
      }
    }
  }
}

调整后,无论是读取父节点/TEST_ADMIN/还是子节点/TEST_ADMIN/xxx,都能匹配对应规则。

方案2:移除身份模拟,使用Admin SDK默认管理员权限

如果不需要模拟普通用户测试规则,而是想直接通过服务账户的管理员权限访问数据库,可移除databaseAuthVariableOverride配置。Admin SDK用服务账户初始化后,默认拥有绕过所有安全规则的完全权限:

const admin = require('firebase-admin');
var serviceAccount = require('.\\serviceAccountKey.json');

try{
  admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "你的数据库URL"
  });
  console.log("初始化成功")
} catch(err) {
    console.log("初始化失败:", err)
}

const db = admin.database();
const ref = db.ref('/TEST_ADMIN/');

ref.once('value')
  .then((snapshot) => {
    console.log('节点数量:', snapshot.numChildren());
  })
  .catch((error) => {
    console.error('获取数据失败:', error);
  });

验证说明

你能正常访问Promo节点,是因为该节点直接配置了.read: true规则;而TEST_ADMIN父节点未配置规则,所以即使子节点有权限,父节点的访问仍会被拒绝。

内容的提问来源于stack exchange,提问作者ViOrRus Oralov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:12:23