Firebase规则校验现有资源返回permission denied,创建帖子触发如何解决
问题原因
- 核心错误出在
write规则误用了resource变量:resource指向Firestore中已经存在的目标文档数据,创建新帖子属于create类型的写入操作,此时目标文档还未生成,resource为空值,校验条件直接不成立,因此返回权限拒绝。 - 额外问题:原规则没有对写入的
editStatus字段做合法性校验,可能导致非法值被写入数据库。
修复方案
将原write规则拆分,区分创建、更新/删除场景,分别适配校验逻辑即可:
match /posts/{post} { // 原有读规则保持不变 allow read: if request.auth != null && resource.data.editStatus == 'published' || request.auth.uid == resource.data.authorId; // 新增帖子的校验规则 allow create: if request.auth != null // 校验传入的authorId必须等于当前登录用户的uid && request.auth.uid == request.resource.data.authorId // 校验editStatus只能是规定的两个取值,不需要校验可删除该行 && request.resource.data.editStatus in ['published', 'draft']; // 更新、删除帖子的校验规则 allow update, delete: if request.auth != null // 校验操作者是帖子原作者 && request.auth.uid == resource.data.authorId // 更新时同样校验editStatus取值合法性,不需要校验可删除该行 && request.resource.data.editStatus in ['published', 'draft']; }
说明:request.resource指向客户端请求中要写入的新文档数据,适配创建场景下的校验需求。
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

