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

为何实现如下代码仍出现Firebase权限拒绝错误?

为啥你的React Native + Firestore会出现权限拒绝错误?

嘿,我来帮你拆解下这个问题的常见原因,大概率和Firestore的规则或者认证流程有关:

1. Firestore安全规则没配置对(最可能的元凶)

你提到Firestore规则内容不完整,这几乎就是问题所在了。默认的Firestore规则要么是完全关闭(只允许控制台访问),要么是只要求用户登录,但没细化到“用户只能访问自己的数据”。

你的代码里访问的是users/{当前用户UID}/memos这个子集合,对应的安全规则得明确授权:只有登录用户能访问自己UID下的memos内容。正确的规则应该是这样的:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 限定只有当前登录用户能读写自己的memos子集合
    match /users/{userId}/memos/{memoId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

如果你的规则没这么配置,Firestore自然会拒绝访问请求,抛出permission denied。

2. 用户认证状态还没稳定就请求数据

你在componentWillMount里直接拿currentUser,但要注意:App刚启动时,Firebase的认证状态可能还没初始化完成,这时候currentUser可能是null。用null的UID去访问集合,肯定会触发权限错误。

建议改成监听认证状态变化,等用户状态稳定后再请求数据:

componentWillMount() {
  // 监听用户认证状态,确保拿到有效用户后再请求数据
  firebase.auth().onAuthStateChanged((user) => {
    if (user) {
      const db = firebase.firestore();
      const settings = { timestampsInSnapshots: true };
      db.settings(settings);
      db.collection(`users/${user.uid}/memos`)
        .onSnapshot((snapshot) => {
          const memoList = [];
          snapshot.forEach((doc) => {
            memoList.push({ ...doc.data(), key: doc.id });
          });
          this.setState({ memoList });
        });
    } else {
      console.log("用户还没登录哦,先处理登录流程吧");
    }
  });
}

3. 集合路径和数据结构不匹配

再检查下你的Firestore数据结构:是不是users集合下有个以用户UID命名的文档,然后这个文档里有memos子集合?如果你的数据结构是memos集合里的每个文档都带userId字段(用来关联用户),那你代码里的路径写法就错了,应该改成db.collection('memos').where('userId', '==', user.uid),同时安全规则也要对应调整成检查文档里的userId字段和当前用户UID一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:48:12