Firestore安全规则:getDocs无法读取多文档但getDoc可单文档读取
问题原因与解决办法
核心原因
Firestore的集合查询(getDocs)和单文档读取(getDoc)规则校验逻辑不同:
- 单文档读取时,仅校验当前请求的单个文档是否满足
request.auth.uid == resource.data.author,只要该文档的author字段匹配当前用户UID,就能通过校验。 - 集合查询采用预校验机制:Firestore不会先查询全集合再逐个校验规则,而是先检查你的查询是否能保证所有返回结果都符合规则。直接调用
getDocs(col)未加过滤条件时,Firestore会判定你试图读取整个集合,而集合内不可能所有文档的author都属于当前用户,因此返回权限错误。
解决办法
修改集合查询代码,添加与安全规则匹配的过滤条件,仅查询当前用户作为author的文档:
const col = collection(db, collectionPath) // 获取当前登录用户的UID const currentUserUid = auth.currentUser.uid; // 构造带过滤条件的查询 const userDocsQuery = query(col, where("author", "==", currentUserUid)); // 执行查询 const documents = await getDocs(userDocsQuery);
此时Firestore会验证你的查询只会返回符合author == 当前用户UID的文档,与安全规则要求完全匹配,即可正常读取目标文档集合。
内容的提问来源于stack exchange,提问作者kr17
相关产品推荐
相关产品推荐

