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

使用Firebase获取Firestore数据时遭遇permission-denied错误求助

解决Firestore Permission Denied错误

针对你遇到的permission-denied错误,核心问题是Firestore安全规则限制了数据访问,或代码未满足规则要求的访问条件,以下是具体排查和解决步骤:

1. 检查并调整Firestore安全规则

Firestore默认规则要求用户必须认证才能读写数据。若应用未实现登录功能,或测试阶段需临时开放访问,可修改规则:

开发测试用规则(仅本地/开发环境)

登录Firebase控制台,进入Firestore数据库的规则标签页,替换为:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

注意:上线前必须改为严格规则(如仅允许认证用户访问),避免数据泄露。

生产环境推荐规则(需用户认证)

若应用要求登录后访问数据,使用基于用户UID的规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

2. 确保用户已完成认证

若规则要求request.auth != null,但代码未先完成用户登录,会触发权限拒绝。修改逻辑,等待认证完成后再请求数据:

import { onAuthStateChanged } from "firebase/auth";

const [list, setList] = useState([]);
const CollectionRef = collection(db, "users");

const getList = async () => {
  try {
    const data = await getDocs(CollectionRef);
    const filteredData = data.docs.map((doc) => ({
      ...doc.data(),
      id: doc.id,
    }));
    setList(filteredData);
  } catch (err) {
    console.error(err);
  }
};

useEffect(() => {
  // 监听认证状态,登录后再获取数据
  const unsubscribe = onAuthStateChanged(auth, (user) => {
    if (user) {
      getList();
    } else {
      console.log("用户未登录,无法访问Firestore数据");
    }
  });

  return () => unsubscribe();
}, []);

3. 验证Firebase配置正确性

检查环境变量是否正确加载,确保firebaseConfig中的projectId、apiKey等参数与Firebase控制台项目信息完全一致。可打印配置确认:

console.log(firebaseConfig);

若字段为空或错误,修正环境变量配置值。

4. 排除初始化代码冲突

你的代码同时导入了getFirestore和initializeFirestore,但实际使用getFirestore初始化实例,这部分无问题,确保没有重复初始化Firestore实例即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:10:20