Firebase Firestore规则配置后持续出现permission-denied错误求助
Firestore权限拒绝问题排查
当前使用的Firestore规则
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 仅允许已认证用户读写文档,且用户uid需匹配文档的uid字段 match /{document=**} { allow read, write: if request.auth != null && request.auth.uid == resource.data.uid; } } }
按规则意图,已认证且uid匹配文档uid字段的用户可执行读写操作,但实际调用代码时持续触发权限拒绝错误。
Flutter/Dart代码实现
Firestore实例初始化:
static FirebaseFirestore instance = FirebaseFirestore.instance; static CollectionReference colRef = instance.collection('someCollection');
数据写入方法:
Future<void> updateData() async { final uid_ = FirebaseAuth.instance.currentUser!.uid; final data = {'uid': uid_}; await colRef.doc(uid_).set(data); }
已尝试的解决方案
- 确认用户已完成认证,且
uid正确传入方法 - 使用
set替代update,规避文档不存在的问题 - 在写入数据中显式添加
uid字段 - 尝试将规则中的
request.auth.uid == resource.data.uid替换为request.auth.uid == resource.id - 简化规则为仅校验
request.auth != null,此配置可正常运行,但权限范围过宽 - 代码中显式调用
FirebaseAuth.instance获取用户信息
具体错误信息
flutter: [cloud_firestore/permission-denied] 调用者无权执行指定操作。
问题根源与修正方案
核心问题
原规则中使用resource.data.uid校验,但**resource代表操作前已存在的文档**。当调用set创建新文档时,resource为null,此时resource.data.uid会直接导致规则校验失败。
修正后的规则
将读写规则分开处理,写入操作校验待写入数据中的uid(即request.resource.data.uid):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // 读取操作:校验已存在文档的uid字段 allow read: if request.auth != null && request.auth.uid == resource.data.uid; // 写入操作(创建/更新):校验待写入数据中的uid字段 allow write: if request.auth != null && request.auth.uid == request.resource.data.uid; } } }
若需确保更新操作只能修改自己的文档,可进一步优化写入规则:
allow write: if request.auth != null && request.auth.uid == request.resource.data.uid && (resource == null || request.auth.uid == resource.data.uid);
该规则含义:写入时,待写入数据的uid必须等于用户uid;若为更新操作(文档已存在),原文档的uid也需匹配用户uid。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

