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

Firestore安全规则疑问:Read请求中resource与request.resource为何不同?

Firestore安全规则里resource和request.resource的核心区别

先看你的代码对比:

正确的read规则(可正常运行):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{user} {
      allow read: if request.auth != null && request.auth.uid == resource.data.owner;
      allow write: if request.auth != null && request.auth.uid == request.resource.data.owner;
    }
  }
}

修改后触发权限错误的read规则:

allow read: if request.auth != null && request.auth.uid == request.resource.data.owner;

问题根源是搞混了resource和request.resource的适用场景:

  • resource:对应Firestore里已经存在的目标文档数据,只在读取已有文档、更新/删除已有文档时有效。读取操作中,你要校验的是现有文档的owner字段和当前用户uid是否一致,所以用resource.data.owner才是正确的。
  • request.resource:对应本次请求要写入的新文档数据,仅在创建(create)或更新(update)文档的写入操作中存在。读取请求没有要写入的内容,所以request.resource在read规则里是不存在的,调用request.resource.data.owner会返回空值,直接导致权限校验条件不满足,触发权限错误。

简单说:读操作拿的是库里已有的数据,所以用resource;写操作拿的是你要提交的新数据,所以用request.resource。你的write规则用request.resource是对的,因为要确保写入的新文档owner是当前用户,但读操作里用它就完全不成立。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:35:13