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

如何在Firebase Security Rules中获取Firestore文档名并验证权限

Firestore安全规则中获取文档ID并验证用户身份的正确方式

当然可以在Firestore安全规则中获取文档名称(即文档ID),用来验证用户ID与文档ID是否一致。你遇到的Null value error,大概率是因为在不适用resource.id的场景中使用了它,比如集合查询操作。

问题原因

resource对象代表的是已经存在的目标文档数据,只有在针对单个文档的读取/写入操作中才会有效。如果是集合级别的操作(比如查询整个用户集合),Firestore在评估规则时无法提前获取每个文档的resource,此时resource会是null,直接访问resource.id就会触发空值错误。

正确解决方案

更可靠的方式是直接通过路径通配符获取文档ID,这种方式在单个文档操作和集合查询场景下都能正常工作。假设你的数据库结构是users/{userId}(每个用户文档的ID等于用户的UID),规则可以这么写:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 验证单个用户文档的读取权限:文档ID等于当前用户UID
    match /users/{userId} {
      allow read: if request.auth != null && userId == request.auth.uid;
      
      // 如果需要限制写入(比如只能创建自己的文档)
      allow write: if request.auth != null && userId == request.auth.uid;
    }

    // 若需允许集合查询,但仅返回当前用户的文档
    match /users/{userId} {
      allow list: if request.auth != null && userId == request.auth.uid;
      // 或者强制查询条件必须包含文档ID等于用户UID(更严格)
      // allow list: if request.auth != null && request.query.where('__name__', '==', request.auth.uid);
    }
  }
}

关于resource.id的正确使用场景

如果是针对单个文档的写入操作(比如更新自己的文档),可以用resource.id来验证现有文档的ID是否与用户UID一致:

match /users/{userId} {
  allow update: if request.auth != null && resource.id == request.auth.uid;
}

这种场景下resource是存在的,不会触发空值错误。

测试环境注意事项

在规则测试工具中,测试单个文档读取时,要确保指定具体的文档路径(比如users/test-user-uid),并设置测试用户的UID与文档ID一致;如果测试集合查询,要使用基于通配符的规则,避免用resource.id。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 11:06:24