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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 22:45:01