我有一个网站,用户需要登录。他们可以上传和删除自己的照片,但这些照片应该是私密的,所以图像不会设置为任何人都可以查看的公开图像。
我知道我们可以使用 IAM 策略将对 S3 存储桶中不同文件夹的访问限制为不同的 IAM 用户。但是网站用户只是数据库(可能是 MySQL)中记录的普通注册用户,他们不是 IAM 用户。
无需为每个网站用户设置 IAM 用户,设置此功能的逻辑是什么?您能推荐一些好的例子吗?还是我想太多了,觉得还有更简单的方法来设置这种限制?
在此先感谢您的任何建议。
答案1
另一种选择是完全不使用 IAM 角色和凭证,而是使用S3 预签名 URL。使用预签名 URL,您可以创建安全、有时间限制的图像链接,从而允许对 S3 中的其他私有对象进行未经身份验证的访问。换句话说:
- 您的 S3 对象都是私有的,除了 Web 服务器之外,没有其他人可以访问它们。
- 当用户登录时,您会为其图片生成预签名的 URL。这些 URL 将为用户提供对其内容的临时访问权限(例如有效期为 1 小时)。
- 当链接过期(例如 1 小时后)时,它将不再提供对用户图像的访问权限。
这样,您便可以不再需要任何 IAM 用户或网站用户的 IAM 角色。
以下是如何实现它的简单演示:S3 预签名 URL 演示
您还可以使用预签名 URL 进行图片上传,但这有点复杂。使用标准上传方法将图像上传到服务器可能更容易,然后服务器将它们上传到 S3。
与使用 Cognito 相比,这是一种更有限的方法,但可能更容易实现。
希望有帮助:)
答案2
你当然不需要一个IAM 用户对于每个网站用户来说,这是无法管理的。
推荐的方法是使用AWS Cognito用于用户身份验证用户池(即数据库中的用户列表)。Cognito 将代表您处理登录、注销、密码重置等,一旦用户通过身份验证,它将发出一组临时 AWS 凭证这将使其能够访问定义的资源,在你的情况下是S3 存储桶中的某些文件夹。
详细信息在允许 Cognito 用户访问其 S3 存储桶中的对象- 这可能正是您所需要的。
使用 Cognito 的额外好处是,可以非常轻松地启用社交媒体帐户登录 - Facebook、Google 等登录。请参阅将社交身份提供商添加到用户池。
希望有帮助:)