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

问题描述 投票:0回答:3

在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 firebase-security firebase-storage
3个回答
10
投票

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

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

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


0
投票

(另一种解决方案)通过身份验证声明限制存储访问

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


原问题:

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

是的,这可以通过检查

auth.token
来完成。

使用 Google 登录的 Web 应用程序的示例流程:

  1. 创建一个云函数来设置自定义声明,用于根据当前身份验证用户检查该文件是否存在。
  2. 用户通过 Google 授权成功后,调用该云函数为 auth 对象设置值。
  3. 查看存储规则中的
    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


0
投票

您可能想查看 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/

© www.soinside.com 2019 - 2024. All rights reserved.