You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:54:20