群组的 Firebase 存储安全规则

ern*_*ton 7 firebase firebase-security firebase-storage google-cloud-firestore

我知道对此有几个问题(例如/sf/answers/3696600071/),但我仍然没有很好的解决方案。

我的应用程序有Groups,它们是动态创建/删除的,并且可以随时添加/删除成员(用户)。

每个Group 有 0..N 个私有文件(Firebase Storage),保存在不同的路径中(都带有前缀groups/{groupId}/...)。

在 Firestore 安全规则中,我使用get()&exists()来了解登录用户是否属于某个组。但我无法在 Firebase 存储安全规则中执行此操作。

2个建议的解决方案是:

  • 用户声明:

但是令牌需要刷新(注销/登录,或更新过期的令牌),这对我的用例来说是不可接受的,因为用户一旦受到邀请就需要立即访问。此外,一个用户可以是许多组的一部分,这些组可能会增长超过 1000 字节。

  • 文件元数据:

但是组可以在不同的路径中有 N 个文件,因此我需要循环列出组的所有文件,并在每个文件的元数据中设置组成员的用户 ID,以允许对其进行访问。当添加/删除成员时,这将是由 Firestore(一个 Firebase 函数)触发的操作。

我不喜欢这种方法,因为:

  • 需要循环列出 N 个文件并为每个文件设置元数据(性能不高)
  • 要添加新文件,我想我需要设置create为 public(因为还没有要检查的元数据),然后需要触发一个函数来将 userIds 添加到元数据
  • 授予文件访问权限可能会有几秒钟的延迟,在我的情况下,如果用户在此之前打开群组页面,体验不佳,这可能会导致问题

所以,我的问题是:

  1. 有没有更好的办法?
  2. 如果我只允许客户端getcreate所有文件在身份验证时(不允许deletelist),这是否足以保证安全?我认为恶意黑客可能有可能通过匿名用户上传任何内容,或者如果他们知道路径,则可能会读取所有私人组文件......

谢谢!

Dou*_*son 5

如果自定义声明对您不起作用,则确实没有“好”的方法来实现这一点。你唯一真正的选择是:

  • 以某种方式利用 Cloud Functions 将 Firestore 中的相关数据镜像到 Storage 中,将 Firestore 文档数据放入 Storage 对象元数据中进行规则检查。
  • 通过您控制的后端(也可以是云功能)路由对存储的所有访问,该后端执行所有相关的安全检查。如果您使用 Cloud Functions,这将不适用于内容大于 10MB 的文件,因为这是 Cloud Functions 请求和响应大小的限制。

请向 Firebase 支持提交功能请求,以允许在存储规则中使用 Firestore 文档 - 这是一个常见请求。 https://support.google.com/firebase/contact/support