Firestore安全规则问题:仅允许用户写入ID匹配邮箱的文档失效
嘿,我来帮你排查下Firestore安全规则的问题~
问题分析与修复方案
你的规则有几个关键问题导致无法生效,我逐一给你拆解:
1. 缺少核心前置校验
你的需求是仅允许已完成身份认证且已绑定邮箱的用户操作,但当前规则完全没做这两项基础校验。如果用户未登录,或者登录后没有设置邮箱,request.auth.email会是null,不仅逻辑会出错,也完全不符合你的权限要求。
2. 文档ID的判断逻辑错误
request.resource.id并不是你要找的文档ID!request.resource代表的是写入后文档的内容快照,它并没有id这个属性来指代文档的路径ID。正确获取当前操作的文档ID,应该用匹配路径里的变量(比如我下面代码里的docId),或者直接用document.id(当前match块里的document指代正在操作的文档实例,document.id就是它的ID)。
3. 规则范围过于宽泛
你用match /{document=**}递归匹配了所有文档和子集合,这不仅不符合你只针对my-document集合的需求,还可能引发其他意外的权限问题。
修复后的规则代码
根据你的需求,调整后的规则应该是这样:
service cloud.firestore { match /databases/{database}/documents { // 只针对my-document集合下的文档做权限控制 match /my-document/{docId} { allow write: if // 校验1:用户已完成身份认证 request.auth != null && // 校验2:用户已绑定邮箱 request.auth.email != null && // 校验3:文档ID与用户邮箱完全一致 request.auth.email == docId; } } }
额外提示
- 文档ID是大小写敏感的,而邮箱本身不区分大小写,如果需要忽略大小写匹配,可以把判断条件改成
request.auth.email.toLowerCase() == docId.toLowerCase()。 - 如果需要区分创建、更新、删除操作,可以把
allow write拆成allow create, update, delete分别设置规则(不过你的需求里写操作应该都适用这套逻辑)。
内容的提问来源于stack exchange,提问作者aglassman
相关产品推荐
相关产品推荐

