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

Firestore安全规则配置问题:仅允许用户访问自身所属集合文档

Firestore安全规则问题排查与修正方案

问题根因

你编写的规则存在3个核心错误导致无法生效:

  1. users集合规则冲突:create权限是write权限的子集,你单独配置的allow create: if request.auth != null会覆盖read,write规则里的create校验,允许任意登录用户创建任意用户ID的文档,不符合仅访问自身用户文档的要求。
  2. periods集合读权限完全失效:request.resource仅在写请求(创建/更新)中存在,读请求没有该对象,导致读periods的校验条件永远为假,所有读请求被直接拒绝。
  3. 缺失空认证判断:未登录用户访问时,request.auth为null,直接读取request.auth.uid会触发规则执行错误,直接返回拒绝。

排查步骤

  • 先在Firebase控制台的「规则游乐场」模拟不同场景的请求:分别模拟未登录、登录用户访问自己的用户文档、登录用户访问他人的用户文档、登录用户读自己的periods、登录用户写他人的periods,定位具体哪条规则不生效。
  • 检查规则的覆盖逻辑:Firestore安全规则是只要有一条allow条件为真就允许访问,注意不要出现更宽松的规则覆盖严格规则的情况。
  • 区分resource和request.resource的使用场景:resource指代数据库中已存在的文档数据,读操作、更新/删除操作都可以读取;request.resource指代客户端提交的即将写入的数据,仅写操作可用。

修正后规则

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      // 仅登录用户本人可读写自己的用户文档,包含创建场景
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
    
    match /periods/{periodId} {
      // 读操作:校验已有文档的owner_id为当前登录用户
      allow read: if request.auth != null && request.auth.uid == resource.data.owner_id;
      // 写操作:校验提交的owner_id为当前登录用户,如需防止修改他人文档的owner_id,可额外增加`&& request.auth.uid == resource.data.owner_id`
      allow write: if request.auth != null && request.auth.uid == request.resource.data.owner_id;
    }
  }
}

规则说明

  1. users集合不再单独配置create规则,合并到整体读写校验中,确保用户只能操作自己的用户文档,注册时只要指定文档ID为自己的uid即可正常创建。
  2. periods集合拆分读写校验逻辑,读操作读取已有文档的owner_id字段匹配,写操作读取提交的owner_id字段匹配,都增加了非空认证判断避免规则执行错误。
  3. 如果你需要禁止用户修改periods的owner_id字段,或者防止用户篡改他人的periods文档,可将write规则修改为:
    allow write: if request.auth != null && request.auth.uid == resource.data.owner_id && request.resource.data.owner_id == request.auth.uid;
    

内容的提问来源于stack exchange,提问作者Sébastien REMY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 18:27:09