我正在构建一个用户可以上传照片和视频的网络平台,我使用firebase存储,但是我遇到了一个我无法解决的问题。
我想在将所有文件公开之前手动检查它们。
所以我的第一个想法是制作一个单独的文件夹,当管理员帐户批准文件时,他可以将其从/private/img.jpg移动到/public/img.jpg。但是由于某些原因,firebase存储没有移动文件的功能。
所以我有了一个新的想法,使用自定义元数据,阻止读取没有元数据可见性设置为"公共"的图像。但对我来说,这个解决方案似乎不是最好的……更重要的是,你不能用特定的元数据阻止列表文件,所以即使文件是私有的,每个人都可以看到文件的存在,以及它的名字,这对我来说是潜在的风险。
有谁可以帮助找到新的解决方案吗?
谢谢你:)
方法#1:你可以使用一个可调用的云函数,你可以从你的应用程序调用它:
- 检查正在调用的用户是否具有Admin角色(使用特定的Custom Claim);
- 如果用户具有正确的角色,则从
private
"文件夹"复制文件;通过使用copy()
方法从谷歌云存储Node.js SDK(这是要在云功能中使用的SDK)到public
一个(顺便说一句,请参阅此文件夹上的答案)。
方法# 2:
另一种完全不同的方法是利用新的云存储安全规则功能,该功能允许"构建灵活的权限来保护基于Firestore中的数据访问存储文件"。"。
有了这个功能,你就可以通过Firestore中的文档管理对文件的访问。对于Cloud Storage中的每个文件,在Firestore中创建一个文档,该文档具有与该文件相同的名称,并包含一个名为(例如)published
的布尔字段。默认情况下,它是false
,如果Admin批准了该文件,则将其更改为true
。
安全规则将沿着以下行(未经测试):
service firebase.storage {
match /b/{bucket}/o {
match /.../{fileId} {
allow read: if
firestore.get(/databases/(default)/documents/files/$(fileId)).published
}
}
}
不要忘记为Firestore集合声明正确的安全规则,这样只有Admin用户才能批准文件。