【发布时间】:2020-03-24 08:04:26
【问题描述】:
我知道对此有几个问题(例如https://stackoverflow.com/a/52808572/3481904),但我仍然没有适合我的情况的解决方案。
我的应用程序有组,它们是动态创建/删除的,并且可以随时添加/删除成员(用户)。
每个组有 0..N 个私有文件(Firebase 存储),保存在不同的路径中(都具有前缀 groups/{groupId}/...)。
在 Firestore 安全规则中,我使用 get() 和 exists() 来了解登录用户是否属于某个组。但我不能在 Firebase 存储安全规则中执行此操作。
提出的 2 个解决方案是:
- 用户声明:
但需要刷新令牌(注销/登录或更新过期令牌),这对我的用例来说是不可接受的,因为用户需要在受邀后立即访问。此外,一个用户可以是许多组的一部分,这些组可能会增长超过 1000 字节。
- 文件元数据:
但是组可以在不同的路径中有 N 个文件,所以我需要循环列出一个组的所有文件,并在每个文件的元数据中设置组成员的用户 ID,允许访问它。当添加/删除成员时,这将是由 Firestore(Firebase 函数)触发的操作。
我不喜欢这种方法,因为:
- 需要循环列出 N 个文件并为每个文件设置元数据(性能不是很好)
- 要添加新文件,我想我需要将
create设置为 public(因为还没有要检查的元数据),然后需要触发一个函数来将 userIds 添加到元数据中李> - 授予文件访问权限可能会延迟几秒钟,如果用户在此之前打开群组页面,这可能会导致问题,体验不佳
所以,我的问题是:
- 有没有更好的方法?
- 如果我只允许客户端在通过身份验证时访问所有文件
get和create(不允许delete和list),这是否足以保证安全?我认为恶意黑客可能会使用匿名用户上传任何内容,或者如果他们知道路径,则可能会读取所有私人群组文件......
谢谢!
【问题讨论】:
标签: firebase google-cloud-firestore firebase-storage firebase-security