Firebase Storage安全规则中Firestore引用带项目ID前缀的解决办法
解决Firebase Storage安全规则中引用路径带项目ID的问题
你可以通过字符串截取去掉引用路径开头的项目ID前缀,直接在Storage规则里处理,无需修改Firestore的存储方式。
修改后的规则如下:
rules_version = '2'; service firebase.storage { function postRef(postId) { return /databases/(default)/documents/posts/$(postId); } // 工具函数:移除引用路径的项目ID前缀 function stripProjectId(refPath) { // 按 '/' 分割路径,跳过前3段(空字符串、projects、项目ID),重新拼接剩余部分 let parts = split(refPath, '/'); return '/' + join(parts[3:], '/'); } match /b/{bucket}/o { match /posts/{postId}/images/{imageId} { allow create: if request.auth != null && firestore.get(stripProjectId(firestore.get(postRef(postId)).data.topic)).data.something; } } }
原理说明
Firebase Storage安全规则中,从Firestore文档读取的引用类型会返回包含项目ID的完整路径(格式/projects/[项目ID]/databases/(default)/documents/...),而firestore.get()只接受不带项目ID的路径(格式/databases/(default)/documents/...)。
stripProjectId函数的作用:
- 用
split(refPath, '/')将路径拆分为数组,示例结果:["", "projects", "my-project", "databases", "(default)", "documents", "topic", "xxx"] - 截取数组从索引3开始的部分,得到
["databases", "(default)", "documents", "topic", "xxx"] - 拼接成符合
firestore.get()要求的路径格式
这种方法不需要修改Firestore里的引用存储方式,避免了代码库重构。
内容的提问来源于stack exchange,提问作者user1894369
相关产品推荐
相关产品推荐

