在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 存储规则之间进行通信。 (在这里参考这个问题) 云函数可以监听实时数据库中预期字段的变化,并将文件写入firebase存储,firebase存储可以检查该文件。
Firebase 的云存储安全规则只能访问有关当前请求和文件的信息。他们无权访问完整的存储系统,因此无法检查是否存在另一个文件。
这样做的原因是,每个请求的规则都会在内存中进行评估。为其他对象提供对 Cloud Storage 的访问会降低性能,从而使系统无法扩展。同样的原因也解释了为什么您无法通过安全规则访问 Firebase 数据库。
如果您想要这样的控制,您需要查看 Cloud Functions for Firebase。如果您让用户将文件上传到“暂存”区域,您可以让云功能验证他们是否满足所有先决条件,然后才将文件移动到实际位置(使其可用于进一步处理或供客户查看) .
云存储规则有权访问请求用户的身份验证信息。通过在授权过程中设置检查,可以添加 auth 属性,以便以后在存储规则中进行访问验证。
原问题:
有什么办法让我只允许用户写 some-other-file.pdf 如果他们已经在 相同的路径(或者甚至其他地方,如果效果更好的话)。一直以来 仍然不允许他们写necessary-file.pdf。
是的,这可以通过检查
auth.token
来完成。
使用 Google 登录的 Web 应用程序的示例流程:
auth.token
。自定义声明的 Web 示例: 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
您可能想查看 2022 年的更新
2022 年 9 月 28 日
我们很高兴能够提供最受欢迎的功能请求之一 安全规则。 Cloud Storage for Firebase 中的安全规则现在 支持跨服务规则,两大全新功能 firestore.get() 和 firestore.exists()。这些功能可以让你查询 您项目的Firestore数据,类似于get()和exists() Firestore 规则中的函数。这项新功能允许开发者 构建灵活的权限,而无需在两者中重复逻辑 火库和存储。我们已经看到开发人员实施了一些东西 例如使用云进行组成员身份检查以及复杂的解决方法 函数或者其他服务器修改存储URL等跨服务 规则通过简单的实施取代了所有这些解决方法。
https://firebase.blog/posts/2022/09/announcing-cross-service-security-rules/