Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据

Posted

技术标签:

【中文标题】Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据【英文标题】:Firebase Storage Security Rule : Check if another object exists / check object's metadataFirebase 存储安全规则:检查是否存在另一个对象/检查对象的元数据 【发布时间】:2017-12-08 04:30:12 【问题描述】:

在 Firebase 存储安全规则(不是实时数据库)中,有没有办法检查路径中是否存在另一个对象,或者是否存在另一个对象的元数据?


一些背景

目前我的存储安全规则已设置为用户只有读取权限,而不是对其/users/userId/ 路径的写入权限。

我有一个管理云功能,可以将文件保存到/users/userId/necessary-file.pdf。而且我不希望用户能够修改或编写此文件,并且只有云功能才有权这样做。为了实现这一点,我想我可以匹配文件名,例如:

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

问题

如果用户在同一路径下已经有 necessary-file.pdf,我有什么办法只允许用户编写 some-other-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())
 

作为替代方案,我可以让我的云函数将元数据写入 necessary-file.pdf 并检查它。有什么方法可以执行类似这个伪代码的操作吗? :

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

终于

真正酷的是,如果这在任何方面都是远程可能的,它可以用于以非实时方式在 firebase 数据库和 firebase 存储规则之间进行通信。 (referring to this question here)云函数可以实时监听数据库中预期字段的变化,并将文件写入firebase存储,firebase存储可以检查。

【问题讨论】:

【参考方案1】:

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

这样做的原因是每个请求都在内存中评估规则。为其他对象提供对 Cloud Storage 的访问会降低性能,使系统无法扩展。同样的原因解释了为什么您无法通过安全规则访问 Firebase 数据库。

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

【讨论】:

非常有意义!到时候我会再考虑一下。非常感谢您的快速回复,祝弗兰克 7 月 4 日快乐!【参考方案2】:

(另一种解决方案)使用 Auth Claims 限制存储访问

Cloud Storage Rules 有权访问请求用户的身份验证信息。通过在授权过程中设置检查,可以添加 auth 属性,以便以后在存储规则中进行访问验证。


原问题:

我有什么办法只允许用户写 some-other-file.pdf 如果他们已经有一个 required-file.pdf 在 相同的路径(如果效果更好,甚至在其他地方)。一直以来 仍然不允许他们编写 required-file.pdf。

是的,这可以通过检查 auth.token 来完成。

带有 Google 登录的网络应用程序示例流程:

    创建云函数以设置自定义声明,以根据当前身份验证用户检查该文件是否存在。 在用户通过 Google 授权成功后,调用该云函数为其设置 auth 对象的值。 在存储规则中勾选auth.token

自定义声明的网络示例: https://firebase.google.com/docs/auth/admin/custom-claims?hl=ro#examples_and_use_cases

存储规则示例: https://firebase.google.com/docs/storage/security/rules-conditions?hl=ro#group_private

【讨论】:

以上是关于Firebase 存储安全规则:检查是不是存在另一个对象/检查对象的元数据的主要内容,如果未能解决你的问题,请参考以下文章

通过firebase规则检查数据库中是不是存在相同的数据

如何检查文件是不是存在于 Firebase 存储中?

匿名身份验证用户的这个 Firebase/Firestore 安全规则是不是安全?

firebase 存储和数据库规则通信

所有存储桶的 Firebase 存储安全规则

读取 Firebase 存储映像安全规则