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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:27:03