如何编写Firestore安全规则匹配文档email字段实现删除权限控制
问题原因
你当前编写的安全规则混淆了通配符的作用范围:match /myCollection/{email}中的{email}是对myCollection集合下的文档ID的通配符匹配,而非你文档内部存储的email字段,所以该规则仅会在文档ID和用户登录邮箱一致时才放行删除,和你的需求完全不符。
修正后的安全规则
直接通过resource.data获取目标文档的内部字段做校验即可:
match /myCollection/{docId} { allow delete : if request.auth != null && request.auth.token.email == resource.data.email; }
说明:
{docId}为任意文档ID的占位符,匹配myCollection下的所有文档resource.data指向当前待操作文档的全部字段内容,resource.data.email即可读取你存储在文档内的邮箱字段- 规则会自动在校验时读取目标文档的
email字段,无需额外传参 - 如果你的业务存在邮箱大小写不一致的存储情况,可以调整为统一转小写后比对:
match /myCollection/{docId} { allow delete : if request.auth != null && request.auth.token.email.lower() == resource.data.email.lower(); }
测试&前端代码说明
- Playground测试时需要确保你模拟的已登录用户邮箱,和你选择的测试文档内的
email字段值完全一致,即可校验通过 - 你当前的前端删除逻辑无需修改,查询后批量删除的写法和上述安全规则完全兼容,规则会对每一个待删除的文档单独做权限校验,恶意篡改前端逻辑试图删除他人文档的操作会被自动拦截。
内容的提问来源于stack exchange,提问作者MartinJ
相关产品推荐
相关产品推荐

