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

React Native集成Firestore遇firestore/permission-denied权限拒绝错误求助

解决Firestore权限拒绝(permission-denied)问题

这是新手用Firestore时超常见的坑!你的代码逻辑本身没毛病,问题出在Firestore的安全规则上。

问题根源

默认情况下,Firestore的安全规则是完全拦截所有读写请求的——这是Firebase自带的安全防护,防止陌生人随便操作你的数据库。所以你调用add()时,服务器直接拒绝了未授权的请求。

快速测试方案(仅开发阶段用)

如果只是想先验证功能能不能跑通,可以临时开放权限:

  1. 打开Firebase控制台,找到你的项目 → 进入「Firestore数据库」→ 切换到「规则」标签页
  2. 把默认规则替换成下面的代码:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
  1. 点击「发布」,再回去测试你的addTodo()方法,应该就能正常添加文档了。

⚠️ 重要提醒:这个规则绝对不能用于生产环境!它会让任何人都能读写你的数据库,数据泄露、恶意修改的风险极高。

生产环境的正确规则(推荐)

如果你的应用需要用户登录后才能操作数据,应该设置仅允许已认证用户访问的规则。针对你的todos集合,示例规则如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 允许已登录用户读写todos集合的所有文档
    match /todos/{todo} {
      allow read, write: if request.auth != null;
    }
  }
}

要是想更精细控制(比如用户只能修改自己创建的todo),可以给每个todo文档加个uid字段,然后在规则里判断:

match /todos/{todo} {
  allow read, write: if request.auth != null && request.auth.uid == resource.data.uid;
}

别忘了完成用户认证!

用了上面的认证规则后,你得先在React Native应用里完成用户登录,才能操作Firestore。比如邮箱密码登录的示例代码:

// 可以在登录按钮的点击事件或组件初始化时调用
firebase.auth().signInWithEmailAndPassword('your-email@example.com', 'your-password')
  .then((userCredential) => {
    console.log('用户登录成功,现在可以操作Firestore了');
  })
  .catch((error) => {
    console.error('登录失败:', error.message);
  });

如果你的应用不需要用户登录(比如公开数据),也要根据业务需求缩小规则的开放范围,别用全开放的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:18:25