Amazon web services 限制对AWS S3对象的访问

Amazon web services 限制对AWS S3对象的访问,amazon-web-services,spring-boot,amazon-s3,Amazon Web Services,Spring Boot,Amazon S3,我正在使用AWS S3存储聊天应用程序后端中用户对话中的照片,该应用程序是用Java/Spring Boot编写的。目前,对bucket的访问是公开的,这意味着每个猜测url的用户都可以看到图片 我希望实现的是,将访问资源的权限限制为仅属于给定对话的对话者,以便他们能够看到他们之间发送的照片 我不想通过后端运行所有流量,我只想将授权委托给S3。是否可以设置某种身份验证令牌来限制对s3上给定对象的访问?我会在我的后端生成这个令牌,并可能不时刷新它。此任务还有其他推荐选项吗?您可以为S3对象创建预签

我正在使用AWS S3存储聊天应用程序后端中用户对话中的照片,该应用程序是用Java/Spring Boot编写的。目前,对bucket的访问是公开的,这意味着每个猜测url的用户都可以看到图片

我希望实现的是,将访问资源的权限限制为仅属于给定对话的对话者,以便他们能够看到他们之间发送的照片


我不想通过后端运行所有流量,我只想将授权委托给S3。是否可以设置某种身份验证令牌来限制对s3上给定对象的访问?我会在我的后端生成这个令牌,并可能不时刷新它。此任务还有其他推荐选项吗?

您可以为S3对象创建预签名URL。这将生成一个临时链接,授予对S3对象的访问权,即使该存储桶不是公共的

作为示例/测试,您可以在aws CLI中运行aws s3 presign命令:

aws s3 presign s3://BucketName/SomePhoto.png --expires-in 86400
此命令将返回可用于访问SomePhoto.png的地址。URL的有效期为86400秒,即一天-在中过期是可选的


您可以为S3对象创建预签名URL。这将生成一个临时链接,授予对S3对象的访问权,即使该存储桶不是公共的

作为示例/测试,您可以在aws CLI中运行aws s3 presign命令:

aws s3 presign s3://BucketName/SomePhoto.png --expires-in 86400
此命令将返回可用于访问SomePhoto.png的地址。URL的有效期为86400秒,即一天-在中过期是可选的


如图所示,您可以预先指定URL。在Java API V1中,基本功能如下:

String bucketName = "the-bucket-name";
String objectKey = "/your/object/keyname.jpg";

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

// Set the presigned URL to expire after one hour.
Date expiration = new Date();
long expTimeMillis = expiration.getTime() + 1000 * 60 * 60;
expiration.setTime(expTimeMillis);

// Generate the presigned URL.
GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                new GeneratePresignedUrlRequest(bucketName, objectKey)
                .withMethod(HttpMethod.GET)
                .withExpiration(expiration);

URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

System.out.println("Pre-Signed URL: " + url.toString());
这允许任何人访问图像一小时,如果他们有网址。假设您可以生成包含在网页上的URL,并且共享链接的可能性很低


如果必须保证只有正确的人才能访问映像,则需要某种服务器端组件。您可以通过服务器或可能的API网关/Lambda组件对其进行路由。

如图所示,您可以预先指定URL。在Java API V1中,基本功能如下:

String bucketName = "the-bucket-name";
String objectKey = "/your/object/keyname.jpg";

AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();

// Set the presigned URL to expire after one hour.
Date expiration = new Date();
long expTimeMillis = expiration.getTime() + 1000 * 60 * 60;
expiration.setTime(expTimeMillis);

// Generate the presigned URL.
GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                new GeneratePresignedUrlRequest(bucketName, objectKey)
                .withMethod(HttpMethod.GET)
                .withExpiration(expiration);

URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

System.out.println("Pre-Signed URL: " + url.toString());
这允许任何人访问图像一小时,如果他们有网址。假设您可以生成包含在网页上的URL,并且共享链接的可能性很低


如果必须保证只有正确的人才能访问映像,则需要某种服务器端组件。您可以通过服务器或API网关/Lambda组件将其路由。

向给定对话中的参与者提供临时、预签名的S3 URL。请记住,它们是临时的,如果您需要它们是长期的,那么您可能需要在客户端中实现某种URL刷新功能。向给定对话的参与者提供临时的、预先签名的S3 URL。请记住,它们是临时的,如果您需要它们是长期的,那么您可能需要在您的客户机中实现某种URL刷新功能。