如何在Firebase Storage中限制仅所有者可get访问并解决空值报错
报错原因
你遇到的空值错误确实是resource.metadata.owner字段不存在导致的:Firebase安全规则中如果直接读取不存在的属性会抛出求值异常,而非返回false,所以需要先做存在性校验再进行值比较。
修复后的存储规则
先对resource.metadata和owner字段做非空判断,再执行逻辑比较,修正后的规则如下:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /item/{id}/file.txt { allow get: if request.auth.uid != null && resource.metadata != null && resource.metadata.owner != null && request.auth.uid == resource.metadata.owner; allow delete: if request.auth.uid != null && resource.metadata != null && resource.metadata.owner != null && request.auth.uid == resource.metadata.owner; // 仅允许上传大小小于100MB的文件 allow write: if request.auth.uid != null && request.resource.metadata != null && request.resource.metadata.owner != null && request.auth.uid == request.resource.metadata.owner && request.resource.size < 100 * 1024 * 1024; } } }
也可以用Firebase规则内置的
get()方法简化非空判断,比如resource.metadata.get('owner', '') == request.auth.uid,第二个参数是属性不存在时的默认返回值,这样也可以避免空值异常。
配套上传要求
规则生效的前提是上传文件时必须显式设置owner元数据为当前登录用户的uid,Web端示例代码如下:
const storageRef = ref(storage, `item/${id}/file.txt`); const metadata = { metadata: { owner: auth.currentUser.uid } }; uploadBytes(storageRef, file, metadata);
本地模拟器测试注意事项
如果是之前在模拟器中上传过不带owner元数据的测试文件,需要先删除旧文件,重新上传携带正确元数据的文件后再测试规则,否则旧文件访问仍然会触发空值错误。
内容的提问来源于stack exchange,提问作者papryk
相关产品推荐
相关产品推荐

