无法为安卓应用已认证用户配置Firestore顶层集合列表权限安全规则
问题核心原因
Firestore安全规则不会作为过滤器自动筛选返回结果,它的设计逻辑是:要求你发起的查询本身必须能保证所有返回结果符合规则约束,否则会直接拒绝请求,而不是返回部分符合条件的结果。
不同请求表现差异的原因
- 单文档
get请求可以正常通过:你请求确定ID的单个文档时,规则只需要校验该文档的user_id字段值和当前登录用户UID一致即可,符合校验条件,所以请求成功。 - 全集合查询被拒绝:你直接调用
Firebase.firestore.collection("memos")是请求返回memos集合下的所有文档,规则无法确认集合内所有文档都满足user_id == 当前用户UID的条件,因此直接拒绝请求。
解决方案
你不需要修改现有的数据库结构,只要调整查询逻辑即可:
在查询memos集合时主动添加user_id过滤条件,明确只查询当前登录用户创建的备忘录:
// Kotlin示例,Java写法逻辑一致 val currentUid = FirebaseAuth.getInstance().currentUser?.uid ?: return Firebase.firestore.collection("memos") .whereEqualTo("user_id", currentUid) .get() // 后续业务处理逻辑
你原来的安全规则不需要修改,只要查询携带了对应的user_id过滤条件,规则就会正常校验通过。
补充说明
你之前使用/users/{userId}/memos子集合结构可以生效,是因为该结构下路径直接携带了用户UID参数,规则可以直接匹配路径中的userId变量和当前登录用户UID,不需要依赖文档字段校验,因此直接查询对应子集合即可通过规则校验。
内容的提问来源于stack exchange,提问作者Yoann.G
相关产品推荐
相关产品推荐

