You need to enable JavaScript to run this app. Firestore安全规则中request.resource.auth与request.auth的区别是什么?
优惠活动
大模型
产品
解决方案
定价
更多

Firestore安全规则中request.resource.auth与request.auth的区别是什么?

Firestore安全规则request.resource.auth与request.auth的区别

本质定义差异

1. 标准身份校验字段:request.auth

这是Firebase安全规则内置的全局身份对象,和请求操作的文档内容没有任何关联:

  • 用户通过Firebase Auth完成登录后,这个对象就会存在,未登录时值为null
  • 包含用户的uid、自定义声明(存储在request.auth.token下)等身份相关信息
  • 读、写所有操作场景下都可以正常调用,是身份校验的官方标准写法,你给出的第二个示例就是完全正确的用法:
service cloud.firestore {
  match /databases/{database}/documents {
    // 仅当用户已通过身份认证时,允许其访问"cities"集合下的文档
    match /cities/{city} {
      allow read, write: if request.auth != null;
    }
  }
}

如果要校验用户的自定义声明,也直接用这个字段即可:

allow read: if request.auth != null && request.auth.token.role == 'Finance';

2. 非身份校验字段:request.resource.auth

首先明确request.resource的定义:这个对象仅在写请求(create、update操作) 中存在,代表用户本次请求要写入到Firestore的完整文档内容。也就是说request.resource.auth本质是「你要写入的文档里名为auth的字段的值」,和用户的登录身份没有任何关系:

  • 读操作场景下request.resource本身就不存在,因此request.resource.auth的值永远为null,你给出的第一个示例里读操作的校验逻辑是错误的,大概率是示例作者混淆了字段名,把request.auth误写为request.resource.auth
  • 只有当你的业务逻辑需要校验「用户写入的文档中必须包含auth字段」时,这个写法才合理,绝对不能用来做用户身份登录校验

常见易混淆对象说明

request.auth、resource、request.resource三个对象的区别:

  • request.auth:发起请求的用户的身份信息
  • resource:当前已经存储在Firestore中的目标文档的原有内容,读、写操作都可以调用
  • request.resource:用户本次请求要写入的新文档内容,仅写操作可以调用

内容的提问来源于stack exchange,提问作者Tho Bui Ngoc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 09:45:11