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

Firebase Cloud Storage规则问题:未登录用户仍可访问存储文件

Firebase Cloud Storage权限问题解决方案

一、为什么你的登录限制规则未生效?

你测试用的是带安全令牌的下载URL,这种链接是Firebase生成的临时授权凭证,会直接绕过存储规则的校验——只要令牌有效,任何人拿到链接都能访问,和用户是否登录无关。

要让规则生效,你需要:

  • 测试时使用不带安全令牌的原始文件URL(格式示例:https://firebasestorage.googleapis.com/v0/b/你的存储桶ID/o/文件路径,去掉末尾?token=xxx部分)
  • 正式场景中,通过已登录用户的Firebase SDK调用getDownloadURL()获取链接,此时SDK会自动携带用户身份信息,规则会正常校验request.auth是否存在

二、按用户所属企业控制文件访问的实现方案

核心是按企业ID规划存储路径,并在规则中校验用户所属企业与文件路径的企业ID匹配,具体步骤如下:

1. 规划存储路径

将文件按企业ID分类存储,示例路径结构:

/companies/{companyId}/files/{fileName}

2. 存储用户的企业ID信息

有两种常用方式:

  • 自定义声明(推荐静态场景):通过Firebase Admin SDK给用户添加companyId自定义声明,适合企业ID不会频繁变更的情况
  • Firestore存储(推荐动态场景):在Firestore中创建users集合,每个用户文档中存储对应的companyId,支持后续动态更新

3. 编写对应的存储规则

基于自定义声明的规则

service firebase.storage {
  match /b/{bucket}/o {
    match /companies/{companyId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.token.companyId == companyId;
    }
  }
}

基于Firestore用户信息的规则

service firebase.storage {
  match /b/{bucket}/o {
    match /companies/{companyId}/{allPaths=**} {
      allow read, write: if request.auth != null && 
        get(/databases/$(database)/documents/users/$(request.auth.uid)).data.companyId == companyId;
    }
  }
}

注意事项

  • 使用Firestore查询的规则,需确保存储规则拥有读取users集合的权限,同时频繁查询可能影响规则校验性能
  • 自定义声明只能通过Firebase Admin SDK设置,客户端无法直接修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:20:17