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
相关产品推荐
相关产品推荐

