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

