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 存储安全规则:检查是不是存在另一个对象/检查对象的元数据的主要内容,如果未能解决你的问题,请参考以下文章