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

Firebase实时数据库安全规则失效,查询遇permission_denied问题求助

解决Firebase Realtime Database权限拒绝问题

问题根源

你的安全规则应该是限制了已认证用户仅能访问自己UID对应的/users/{uid}节点,但你的代码尝试读取整个/users节点并通过identifier(邮箱)进行查询,这种跨节点的查询操作不符合当前的权限规则,因此被拒绝。

解决方案

方案一:直接通过UID访问自己的数据(推荐)

既然用户已经完成认证,你可以直接获取当前用户的UID,访问其对应的节点,完全符合安全规则:

const currentUser = firebase.auth().currentUser;
if (currentUser) {
  // 直接访问当前用户的UID节点
  const userRef = firebase.database().ref(`/users/${currentUser.uid}`);
  userRef.once("value").then((snapshot) => {
    const userData = snapshot.val();
    if (userData) {
      this.globalvar.userName = userData.name;
      this.globalvar.userCompany = userData.company;
    }
  });
}

方案二:调整安全规则支持邮箱查询

如果必须通过邮箱查询用户数据,需要修改安全规则,允许已认证用户仅查询自己邮箱对应的记录:

{
  "rules": {
    "users": {
      // 允许已认证用户基于identifier字段查询自己的邮箱
      ".read": "auth != null && query.orderByChild === 'identifier' && query.equalTo === auth.token.email",
      "$uid": {
        // 保留原有的写入权限规则
        ".write": "$uid === auth.uid"
      }
    }
  }
}

修改规则后,你的原代码即可正常运行,但要确保:

  • 用户是通过邮箱密码方式登录的,且Firebase控制台已启用邮箱认证(确保auth.token.email能获取到用户邮箱)
  • 查询的equalTo参数确实是当前用户的邮箱

注意事项

  • 执行数据库操作前,务必确认用户已完成认证(firebase.auth().currentUser不为null),否则安全规则会直接拒绝访问
  • 方案一的性能和安全性更优,因为直接定位到单个节点,无需遍历整个users节点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:31:06