为何调用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
相关产品推荐
相关产品推荐

