我知道与此有关的几个问题(例如https://stackoverflow.com/a/52808572/3481904,但我仍然没有很好的解决方案。
我的应用程序具有Groups,它们是动态创建/删除的,并且成员(用户)可以随时添加/删除。
每个组具有0..N个私有文件(Firebase存储),保存在不同的路径中(所有路径都具有前缀groups/{groupId}/...
)。
在《 Firestore安全规则》中,我使用get()
和exists()
来了解登录用户是否是组的一部分。但是我无法在Firebase存储安全规则中执行此操作。
提出的2个解决方案是:
但是令牌需要刷新(退出/登录或更新过期的令牌),这在我的用例中是不可接受的,因为用户一旦被邀请就需要立即访问。此外,用户可以属于许多组,这些组可能会增长到1000字节以上。
但是组可以在不同路径中包含N个文件,因此我将需要循环列出组中的所有文件,并在每个文件的元数据中设置组成员的userIds,以允许对其进行访问。当添加/删除成员时,这将是由Firestore(Firebase功能)触发的操作。
我不喜欢这种方法,因为:
create
设置为public(因为尚无要检查的元数据,然后需要触发一个Function将userIds添加到元数据中)所以,我的问题是:
get
和create
的所有文件(不允许delete
和list
),这是否足以保证安全?我认为,恶意黑客可能会向匿名用户上传任何内容,或者如果他们知道路径,则可能读取所有私有组文件...谢谢!
如果自定义声明对您不起作用,那么实际上没有实现此目标的“好”方法。您唯一的选择是:
请提交具有Firebase支持的功能请求,以允许在存储规则中使用Firestore文档-这是常见的请求。 https://support.google.com/firebase/contact/support