2017-07-04 84 views
0

在Firebase存储安全规则(而不是实时数据库)中,有没有其他方法可以执行检查:路径中是否存在其他对象,或存在其他对象的元数据?Firebase存储安全规则:检查另一个对象是否存在/检查对象的元数据


一些背景

目前我储存安全规则设置,使用户只具有读取访问权限,并没有写访问他们/users/{userId}/路径。

我有一个管理云功能,将文件保存到/users/{userId}/necessary-file.pdf。而且我不希望用户能够修改或编写此文件,只有云功能才有权执行此操作。要做到这一点,我想我可以匹配类似的文件名:

match /users/{userId}/{fileName} { 
    allow write: if !fileName.matches("necessary-file.pdf") 
} 

问题

有什么办法,我只能让用户写一些,其他-file.pdf如果他们在相同的路径上已经有necessary-file.pdf(或者甚至在其他地方,如果该效果更好)。虽然仍然禁止他们写necessary-file.pdf

那么,有什么办法让我做这样的伪代码吗? :

match /users/{userId}/{fileName} { 
    allow read: if request.auth.uid == userId; 
    allow write: if (!fileName.matches("necessary-file.pdf")) && ("necessary-file.pdf".exists()) 
} 

作为替代方案,我可以有我的云功能,写一个元数据必要-file.pdf并检查太多。有什么办法可以执行像这样的伪代码吗? :

allow write: if "necessary-file.pdf".metadata['canUserWrite'] == 'yesUserCan' 

最后

什么是真正酷的这是,如果这是在任何远程可能的,它可以用来火力数据库,并在一个火力点存储规则之间进行通信不那么实时的方式。 (referring to this question here)云端功能可侦听实时数据库中预期字段的更改,并将文件写入Firebase存储,Firebase存储可检查该文件。

回答

3

Firebase的云存储安全规则只能访问有关当前请求和文件的信息。他们无法访问完整的存储系统,因此无法检查是否存在其他文件。

原因是规则在内存中为每个请求进行评估。为其他对象提供对云存储的访问会降低性能,使系统不可扩展。同样的原因解释了为什么您无法从安全规则中访问Firebase数据库。

如果您想要这样的一些控制,您需要查看Firebase的Cloud Functions。如果您的用户将文件上传到“暂存”区域,则可以让云端功能验证它们是否满足所有先决条件,然后才将文件移动到实际位置(使其可用于进一步处理或供客户端查看) 。

+0

完美感!那么我会做更多的思考。非常感谢7月4日的快速回复和祝福! – johnozbay