Firebase Storage规则无法校验Firestore文档,测试授权失败
Firebase Storage自定义函数权限问题排查
可能的问题点及解决办法
1. Firestore规则未开放Storage服务账号访问权限
Cloud Storage规则调用Firestore时,使用的是Firebase服务账号身份,而非测试用户身份。如果你的Firestore规则默认限制了非用户访问,就会导致isBoat函数无法读取boats集合数据。
- 调整Firestore规则,添加允许Storage服务账号读取
boats集合的配置:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /boats/{boatId} { // 允许Storage服务账号读取该集合 allow read: if request.auth.token.firebase.sign_in_provider == "service_account"; // 本地测试阶段也可以临时用宽松规则排查问题:allow read: if true; } } }
2. isBoat函数逻辑有误
检查你的自定义函数是否正确校验了用户身份:
- 如果
boats集合的文档ID和用户UID一致,确保函数正确引用:
function isBoat() { return exists(/databases/$(database)/documents/boats/$(request.auth.uid)); }
- 如果用户UID是存在于
boats文档的某个字段中(而非文档ID),需要修改查询逻辑:
function isBoat() { return exists(/databases/$(database)/documents/boats/{boat} where boat.userId == request.auth.uid); }
3. 导入的Firestore备份数据异常
确认你通过--import导入的备份数据里,确实存在测试用户UID对应的boats文档:
- 手动查看备份文件的内容,验证数据完整性
- 启动模拟器后,访问Firestore模拟器控制台(默认端口8080),直接检查
boats集合的数据是否正确导入
4. Storage规则路径匹配错误
确保Storage规则的路径匹配逻辑和测试代码中的上传路径一致:
比如规则定义的路径是/boats/{userId}/**,测试代码里上传的路径必须包含对应用户的UID:
service firebase.storage { match /b/{bucket}/o { match /boats/{userId}/{allPaths=**} { allow write: if isBoat() && userId == request.auth.uid; } } }
检查测试代码中是否正确将用户UID拼接到上传路径中。
5. 模拟器缓存导致规则不生效
模拟器可能缓存旧的规则或数据,导致修改无法实时生效:
- 停止所有模拟器进程,删除缓存目录(默认路径
~/.cache/firebase/emulators) - 重新启动模拟器并导入数据,再执行测试
内容的提问来源于stack exchange,提问作者Allennick
相关产品推荐
相关产品推荐

