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

为何调用Firebase Firestore读取集合时出现权限拒绝错误?

Firestore权限拒绝错误原因分析

你执行以下Flutter代码时触发了Firestore权限拒绝错误:

stream = FirebaseFirestore.instance
    .collection('events')
    .doc(widget.event.id)
    .collection('invitations')
    .snapshots();

对应的Firebase Firestore安全规则配置:

match /events/{eventId} {
  match /invitations/{email} {
    allow read: if
        request.auth.token.email == email ||
        request.auth.token.email == get(/databases/$(database)/documents/events/$(eventId)).data.user_id;
  }
}

错误原因分析

  • get操作的权限依赖问题:规则中通过get获取events/{eventId}文档的user_id,但如果当前用户没有读取该events文档的权限,这个get操作会直接失败,进而导致整个读取权限检查不通过。Firestore安全规则中,任何依赖的资源访问被拒绝时,整个条件都会判定为不满足。
  • 集合查询的全文档校验逻辑:你是查询整个invitations集合,而规则是针对单个invitations/{email}文档设置的。Firestore处理集合查询时,会校验集合内所有文档是否都符合规则,只要有一个文档不满足条件,整个查询就会被拒绝。哪怕你是事件创建者(user_id匹配),只要集合里存在某个文档既不匹配你的邮箱,同时又触发了get操作失败,就会导致查询被拒。
  • 字段匹配问题:检查events/{eventId}文档中的user_id字段是否和用户的request.auth.token.email完全一致,注意字段名是否拼写错误(比如是否是userId而非user_id)、大小写是否匹配。
  • 用户认证状态:确保用户已经完成登录认证,request.auth不为null。如果用户未登录,request.auth.token.email不存在,规则中的两个条件都无法满足,直接触发权限拒绝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:01:05