Firestore提交评论触发permission-denied错误,请求排查权限问题
解决Firestore权限拒绝(permission-denied)问题
我一眼就发现了两个核心问题,导致你遇到这个权限错误:
1. 安全规则的路径完全不匹配
你的评论数据是存在**blogs/{blogId}/comments**这个嵌套子集合里,但你的Firestore规则写的是匹配根集合的/comments/{comment}——这完全不是同一个数据位置!相当于你给A房间装了门锁,却去开B房间的门,Firestore自然会用默认的"拒绝所有"规则处理,直接返回权限不足。
2. 规则检查的字段和代码提交的字段不匹配
你的服务层代码里,用户ID是存在author._id字段下的,但规则里却检查request.resource.data.user_uid——规则找不到这个字段,就算路径对了,也会判定权限不通过。
修正方案二选一(推荐第一种,更贴合你的数据结构)
方案1:修正安全规则,匹配正确路径和字段
把你的Firestore规则改成下面这样,既匹配嵌套的comments子集合,又对应代码里的author._id字段:
match /blogs/{blogId}/comments/{comment} { // 删除操作检查评论作者ID和当前登录用户ID一致 allow delete: if request.resource.data.author._id == request.auth.uid; // 写入(新增/修改)操作同样检查作者ID allow write: if request.resource.data.author._id == request.auth.uid; // 读权限开放(如果需要限制读权限,可以根据需求调整,比如只允许登录用户读取) allow read: if true; }
方案2:修正代码提交的字段,匹配原有规则(可选)
如果你想保留规则里的user_uid字段检查,可以在提交评论时额外添加这个字段:
postComment(getBlogId: string, comment: any): Promise<any> { if (this.currentUser) { return this.afs.collection('blogs').doc(getBlogId).collection('comments') .add({ author: { '_id': this.currentUser.uid, 'firstname': this.currentUser.displayName ? this.currentUser.displayName : this.currentUser.email }, user_uid: this.currentUser.uid, // 新增这个字段,和规则的检查项对应 comment: comment.comment, createdAt: firebase.firestore.FieldValue.serverTimestamp(), updatedAt: firebase.firestore.FieldValue.serverTimestamp() }); } else { return Promise.reject(new Error('LogIn to Continue!')); } }
同时别忘了把规则的路径修正为嵌套的子集合:
match /blogs/{blogId}/comments/{comment} { allow delete: if request.data.user_uid == request.auth.uid; allow write: if request.resource.data.user_uid == request.auth.uid; allow read; }
额外检查项
- 确认你的Firestore规则修改后已经发布生效(Firebase控制台里修改规则后要点"发布"按钮)
- 在
postComment方法里加个console.log(this.currentUser.uid),确认当前用户的UID确实正确获取到了 - 可以用Firebase控制台的「监控」->「规则」查看被拒绝的请求详情,能帮你快速定位规则匹配问题
内容的提问来源于stack exchange,提问作者R.Ovie
相关产品推荐
相关产品推荐

