Firebase安全规则疑问:请求邮箱校验与文档字段访问语法
关于Firebase Firestore安全规则的两个疑问
我正在开发一款Flutter Todo应用,支持用户为自己添加任务,或通过对方账户邮箱将任务发送给其他用户。Firebase数据库的todos集合包含以下字段:title、isChecked、recipient、sender、senderUID。
当前使用的Firebase安全规则如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function isOwnerOrAdmin(reminder, auth) { let isOwner = auth.token.email == reminder.recipient; let isAdmin = auth.token.isAdmin == true; return isOwner || isAdmin; } match /todos/{todo} { allow create if // User is author request.auth.uid == request.resource.data.authorUID; allow update, read, delete: if isOwnerOrAdmin(resource.data, request.auth); } } }
疑问列表
- 疑问1:使用
auth.token.email校验请求发起者的邮箱是否为正确语法? - 疑问2:访问文档字段(例如
recipient),request.resource.data.recipient和resource.data.recipient哪个语法更正确?
解答
1. auth.token.email的语法正确性
auth.token.email是Firebase安全规则中获取当前认证用户邮箱的正确写法。不过需要注意两个关键点:
- 仅当用户通过邮箱/密码、Google登录等支持邮箱字段的认证方式登录时,
auth.token.email才有值;匿名登录用户的该字段为null。 - 如果业务要求用户邮箱必须已验证,可额外添加
auth.token.email_verified == true的校验逻辑。
2. 两种文档字段访问方式的区别
两者语法都正确,但适用场景不同:
resource.data:指向数据库中已存在的目标文档的字段数据,适用于read、update、delete操作——因为这些操作都是针对已存在的文档进行的。你当前规则中update、read、delete用resource.data.recipient是完全正确的。request.resource.data:指向请求中待创建或待更新的新文档数据,适用于create和update操作。比如在create操作中要校验收件人字段合法性,就应该用request.resource.data.recipient。
另外注意:你的规则中create条件里写的是request.resource.data.authorUID,但数据库实际字段是senderUID,这里存在字段名不匹配的问题,建议修正保持一致。
内容的提问来源于stack exchange,提问作者shjnlee
相关产品推荐
相关产品推荐

