Firestore快照监听器权限拒绝问题:已登录且用户ID在数组中仍报错
Firestore权限拒绝问题的原因与解决办法
核心原因:查询未满足Firestore的"安全查询"要求
Firestore的规则验证是前置性的——它不会先执行查询获取文档再检查权限,而是要提前确认:所有符合你查询条件的文档,都必然满足规则里的权限要求。
你的查询只过滤了id == 'someId',但规则要求request.auth.uid必须在文档的userIds数组中。Firestore无法提前知道这个someId对应的文档是否包含当前用户的uid,因此直接返回权限拒绝。
解决办法
根据你的实际场景选一种方案:
方案1:如果是通过文档ID查询(推荐)
如果someId就是目标文档的ID,不要用where过滤,直接获取单个文档:
firestore .collection('conversations') .doc('someId') .onSnapshot(callback)
这种情况下,Firestore会先获取文档,再检查resource.data.userIds是否包含当前用户uid,符合你设置的规则逻辑。
方案2:保留where查询,补充安全条件
如果必须用where查询,需要在查询中加入userIds的过滤条件,让Firestore能确认所有符合条件的文档都满足权限要求:
// 先获取当前登录用户的uid const currentUid = firebase.auth().currentUser.uid; firestore .collection('conversations') .where('id', '==', 'someId') .where('userIds', 'array-contains', currentUid) .onSnapshot(callback)
这样查询条件和规则要求匹配,Firestore可以提前验证权限,不会再返回拒绝。
额外注意
确保你的id字段确实和文档ID一致(如果用方案1的话),或者id字段确实存在于文档数据中。另外,确认当前用户的uid没有拼写错误,且确实在目标文档的userIds数组里。
内容的提问来源于stack exchange,提问作者strangeQuirks
相关产品推荐
相关产品推荐

