组的Firebase存储安全规则

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

我知道与此有关的几个问题(例如https://stackoverflow.com/a/52808572/3481904,但我仍然没有很好的解决方案。

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

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

在《 Firestore安全规则》中,我使用get()exists()来了解登录用户是否是组的一部分。但是我无法在Firebase存储安全规则中执行此操作。

提出的2个解决方案是:

  • 用户声明:

但是令牌需要刷新(退出/登录或更新过期的令牌),这在我的用例中是不可接受的,因为用户一旦被邀请就需要立即访问。此外,用户可以属于许多组,这些组可能会增长到1000字节以上。

  • 文件元数据:

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

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

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

所以,我的问题是:

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

谢谢!

firebase google-cloud-firestore firebase-storage firebase-security-rules
1个回答
0
投票

如果自定义声明对您不起作用,那么实际上没有实现此目标的“好”方法。您唯一的选择是:

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

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

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