Firestore规则模拟器报resource.data null错误及移动端权限不足问题
核心问题排查与修复方案
1. 规则变量逻辑错误
你当前规则里的userId是路径/reviews/{userId=**}的通配符变量,取值为路径分段内容,并非当前登录用户的UID。你需要对比的是当前登录用户的身份标识,应该使用request.auth.uid。
2. 数组类型判断逻辑错误
hidingUserId是数组类型,原规则的resource.data.hidingUserId != userId是单值对比逻辑,对数组完全不生效。判断值不在数组内需要使用in操作符取反。
3. 查询与规则不匹配导致权限报错
Firestore安全规则不会自动过滤文档,要求你的查询逻辑必须和规则约束完全对齐,否则会直接返回Missing or insufficient permission错误,模拟器中发起无对应过滤条件的查询时也会出现resource为空的报错。
修正后的安全规则
// 如果你不需要匹配reviews集合下的子集合,直接用{reviewId}匹配文档ID即可 match /reviews/{reviewId} { allow read: if resource.data.hidingUserId == null || !(request.auth.uid in resource.data.hidingUserId); allow delete, update, create: if request.auth != null; }
配套查询要求
发起查询时必须带上和规则匹配的过滤条件,示例逻辑(各端SDK写法一致):
// 取当前登录用户UID const currentUserId = auth.currentUser.uid; // 构造查询,必须包含hidingUserId的过滤条件 const reviewQuery = db.collection('reviews') .where('hidingUserId', 'not-in', [currentUserId]) // 附加其他你需要的查询条件 .get();
注意事项
- 未登录用户的读取场景需要单独调整规则逻辑,上述规则默认适配登录态读取
not-in查询最多支持传入10个对比值,此处仅传入1个用户UID完全符合限制- 模拟器测试时需要先开启认证模拟、填写正确的用户UID,同时查询条件携带
hidingUserId not-in过滤参数才能正常校验
内容的提问来源于stack exchange,提问作者HaKim
相关产品推荐
相关产品推荐

