Flutter应用Cloud Firestore boats集合流查询权限不足的规则排查
Firestore 流查询报
PERMISSION_DENIED 排查与修复 核心报错逻辑
Firestore 安全规则是查询前置校验:执行集合查询/流监听前,会先校验整个查询请求是否符合权限,不会先返回文档再逐篇校验权限。你遇到的两类查询(按owner等值匹配、按share数组包含匹配)同时报错,说明boats集合的规则配置没有覆盖集合级查询的权限要求。
高频错误点
- 规则仅配置了单文档读权限,未拆分
get(单文档读取)和list(集合/流查询)权限- 错误示例:
allow read: if request.auth.uid == resource.data.owner - 问题原因:集合查询时不存在
resource对象,规则直接判定不通过,仅支持已知文档ID的单文档读取场景
- 错误示例:
- 集合查询权限未匹配实际查询过滤条件
- 要实现「查当前用户拥有的船」这类查询,规则必须显式校验查询的过滤条件,否则Firestore无法确认你要查询的文档都属于当前用户,会直接拒绝全表扫描请求
- 未覆盖共享场景的权限逻辑
share数组包含当前UID的查询报错,说明规则未配置「共享给当前用户的船」的读权限判断
修复后的规则配置
match /boats/{boatId} { // 已登录用户可读取两类文档:自己所有的、被共享给自己的 allow get: if request.auth != null && ( request.auth.uid == resource.data.owner || request.auth.uid in resource.data.share ); // 集合查询/流监听权限:仅允许两类合规查询 allow list: if request.auth != null && ( // 匹配查询条件:owner 等于当前用户UID request.query.filter("owner") == request.auth.uid // 匹配查询条件:share 数组包含当前用户UID || request.query.filter("share") == array_contains(request.auth.uid) ); }
代码侧校验项
- 确认查询传入的UID是
FirebaseAuth.instance.currentUser!.uid的真实值,和规则中request.auth.uid完全一致 - 确认数据库中
owner、share字段的存储类型和查询传入值类型匹配(比如owner存字符串UID,不要传入数字类型) - 如果你后续新增其他查询过滤条件,必须同步更新
list规则的校验逻辑
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

