Firestore安全规则配置问题:仅允许用户访问自身所属集合文档
Firestore安全规则问题排查与修正方案
问题根因
你编写的规则存在3个核心错误导致无法生效:
- users集合规则冲突:
create权限是write权限的子集,你单独配置的allow create: if request.auth != null会覆盖read,write规则里的create校验,允许任意登录用户创建任意用户ID的文档,不符合仅访问自身用户文档的要求。 - periods集合读权限完全失效:
request.resource仅在写请求(创建/更新)中存在,读请求没有该对象,导致读periods的校验条件永远为假,所有读请求被直接拒绝。 - 缺失空认证判断:未登录用户访问时,
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; } } }
规则说明
- users集合不再单独配置create规则,合并到整体读写校验中,确保用户只能操作自己的用户文档,注册时只要指定文档ID为自己的uid即可正常创建。
- periods集合拆分读写校验逻辑,读操作读取已有文档的owner_id字段匹配,写操作读取提交的owner_id字段匹配,都增加了非空认证判断避免规则执行错误。
- 如果你需要禁止用户修改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
相关产品推荐
相关产品推荐

