Firestore安全规则配置:如何仅允许用户读写自有文档
Firestore多用户文档权限配置方案
问题核心原因
你当前的规则里最顶部的match /{document=**}直接允许所有已登录且邮箱验证的用户读写所有文档,Firestore的规则逻辑是只要有一条匹配的规则允许操作,就会放行,所以后续针对fooCollection的权限限制完全被这条全局规则覆盖,这就是测试结果异常的根本原因。
正确的安全规则配置
service cloud.firestore { match /databases/{database}/documents { // 默认拒绝所有未明确授权的操作(Firestore默认行为,显式写出更清晰) match /{document=**} { allow read, write: if false; } // 针对fooCollection的权限控制 match /fooCollection/{docId} { // 创建文档:必须登录、邮箱验证,且文档user字段与当前用户邮箱一致 allow create: if isSignedIn() && emailVerified() && request.resource.data.user == request.auth.token.email; // 更新/删除:必须是文档所有者,且更新时不能篡改user字段 allow update, delete: if isSignedIn() && emailVerified() && isOwner() && (request.resource.data.user == resource.data.user); // 读取:仅允许文档所有者访问 allow read: if isSignedIn() && emailVerified() && isOwner(); } // 第二个结构类似的集合,复制上述规则修改集合名即可 match /barCollection/{docId} { allow create: if isSignedIn() && emailVerified() && request.resource.data.user == request.auth.token.email; allow update, delete: if isSignedIn() && emailVerified() && isOwner() && (request.resource.data.user == resource.data.user); allow read: if isSignedIn() && emailVerified() && isOwner(); } // 工具函数 function isSignedIn() { return request.auth != null; } function emailVerified() { return request.auth.token.email_verified; } function isOwner() { return request.auth.token.email == resource.data.user; } } }
关键细节说明
- 默认拒绝策略:先全局拒绝所有操作,确保只有你明确配置的集合能被访问,避免权限泄露。
- 创建权限:强制文档的
user字段等于当前用户邮箱,从源头防止用户创建不属于自己的文档。 - 更新/删除权限:除了验证所有者身份,额外限制
user字段不能被修改,避免用户通过更新操作抢占他人文档。 - 读取权限:Firestore会自动过滤用户无权访问的文档,你不需要再在本地做数据过滤,直接请求集合即可拿到自己有权限的文档。
后续迁移提示
等后续把user字段换成用户ID时,只需要把规则里所有request.auth.token.email替换成request.auth.uid,同时确保文档的user字段存储为用户ID,规则逻辑无需大改。
内容的提问来源于stack exchange,提问作者CfC
相关产品推荐
相关产品推荐

