已认证用户创建Google Firestore文档遇权限不足错误的排查与解决
问题分析与解决方案
核心问题
你的安全规则存在两个关键错误:
- 函数名大小写不匹配:定义的函数是
OwnsResource()(首字母大写),但调用时写的是ownsResource()(全小写),Firestore规则对大小写敏感,导致函数调用直接失败。 - 创建文档时无法访问
resource对象:resource.data指向的是已存在的文档数据,而创建操作执行时目标文档还不存在,所以必须改用request.resource.data来获取即将写入的文档数据。
修正后的安全规则
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 判断用户已登录且是资源所有者(兼容创建/读写场景) function ownsResource() { return request.auth.uid != null && (request.resource.data.ownerId == request.auth.uid || (resource != null && resource.data.ownerId == request.auth.uid)); } // 默认拒绝所有访问 match /{document=**} { allow read, write: if false; } // 允许项目的创建、读写操作仅对所有者开放 match /projects/{project} { allow create, read, write: if ownsResource(); } } }
规则说明
- 统一了函数名的大小写,保证定义和调用一致;
- 优化了
ownsResource()函数逻辑:- 创建文档时,通过
request.resource.data.ownerId验证写入的ownerId是否等于当前用户UID; - 读写已存在文档时,通过
resource.data.ownerId验证用户是否为文档所有者;
- 创建文档时,通过
- 保留默认拒绝规则,确保未配置的集合不会被意外访问。
额外验证建议
- 确认
this.auth.session!.userUid确实是当前登录用户的UID,避免出现值为空或不匹配的情况; - 可以用Firebase控制台的规则模拟器测试创建操作,输入用户UID和模拟请求数据,快速验证规则是否生效。
内容的提问来源于stack exchange,提问作者Liam M
相关产品推荐
相关产品推荐

