当前位置:   article > 正文

在Minio以STS方式获得临时凭据上传文件

assumeroleprovider provider = new assumeroleprovider( endpoint, access_key_c

一、写在前面

一个常见的场景是:需要让客户端来上传图片,面临的安全性问题。给与客户端永久凭据无疑是很大风险的,我们还可以选择“给予一个临时凭据,这个凭据关联到一个 授权的用户,我们可以随时停用和修改这个用户具有的权限”

Minio提供了STS 的方式来实现这个方法。

MinIO安全令牌服务(STS)API允许应用程序生成用于访问MinIO部署的临时凭据。参考https://min.io/docs/minio/linux/developers/security-token-service.html

整体方案是:

  1. Minio服务器的web页面创建一个 用户和策略
  2. Java应用服务通过 使用上面的用户信息 使用 API 可取得临时的 凭据 token
  3. 将 临时凭据 给到前端 Web,或者App
  4. 前端使用 临时凭据 和 js API 等,进行对象的上传,获得等。

二、部署和启动 Minio

2.1、安装

  1. wget https://dl.min.io/server/minio/release/linux-amd64//minio
  2. chmod +x minio

这时可使用 ./minio 了

2.2 启动

./minio server /mnt/data

注意:/mnt/data 是图片存放位置

为了使用方便,自己写个启动脚本

  1. export MINIO_ROOT_USER=admin
  2. export MINIO_ROOT_PASSWORD=password
  3. export MINIO_REGION=cn-beijing-2
  4. nohup ./minio server /mnt/data &

*注意:

  • MINIO_ROOT_USER 你的管理员账号
  • MINIO_ROOT_PASSWORD 你的管理员密码
  • MINIO_REGION 是你指定的区域名

2.3 访问控制台

打开网页: http://你的机器:9000

三、配置临时凭据相关的设置项

我采用 web控制台页面来设置,比较方便。
打开 http://你的机器:9000 , 登录进去

3.1、登录控制面板,创建策略

image.png
image.png

图片中编号3: 填写个策略名
图片中编号4: 填写 json 格式描述的具体策略

可以按我的填,下面的json描述了一个可读,写,删,获得桶位置的策略。

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": [
  7. "s3:GetObject",
  8. "s3:PutObject",
  9. "s3:DeleteObject",
  10. "s3:GetBucketLocation"
  11. ],
  12. "Resource": [
  13. "arn:aws:s3:::*"
  14. ]
  15. }
  16. ]
  17. }

3.2、创建用户,绑定策略

image.png
image.png

图片中编号4:填写一个 用户名(随便填,记下来要用)
图片中编号5:填写一个 密码(随便填,记下来要用)
图片中编号6:打钩选一个策略,就是我们上面 创建的策略 勾选上。

四、通过Java 获得凭据并上传和获得上传后的URL

1、创一个Maven项目
2、 加入依赖

  1. <dependency>
  2. <groupId>io.minio</groupId>
  3. <artifactId>minio</artifactId>
  4. <version>8.3.3</version>
  5. </dependency>

3、取得临时凭据
一些静态变量定义

  1. //服务所在ip地址和端口
  2. public static final String ENDPOINT = "http://10.0.0.102:9000/";
  3. //mc的用户名
  4. public static final String ACCESS_KEY_COMPANY = "sts-user";
  5. //mc的密码
  6. public static final String SECRET_KEY_COMPANY = "sts-password";
  7. //aws服务端点
  8. public static final String REGION = "cn-beijing-2";
  9. //上传的bucket名
  10. public static final String BUCKET = "test";
  11. //授权策略,允许访问名为bucket的桶的目录
  12. public static final String ROLE_ARN = "arn:aws:s3:::test/*";
  13. public static final String ROLE_SESSION_NAME = "anysession";
  14. //定义策略,可进行二次限定
  15. public static final String POLICY_GET_AND_PUT = "{\n" +
  16. " \"Version\": \"2012-10-17\",\n" +
  17. " \"Statement\": [\n" +
  18. " {\n" +
  19. " \"Effect\": \"Allow\",\n" +
  20. " \"Action\": [\n" +
  21. " \"s3:GetObject\",\n" +
  22. " \"s3:GetBucketLocation\",\n" +
  23. " \"s3:PutObject\"\n" +
  24. " ],\n" +
  25. " \"Resource\": [\n" +
  26. " \"arn:aws:s3:::test/*\"\n" +
  27. " ]\n" +
  28. " }\n" +
  29. " ]\n" +
  30. "}";

得到 临时凭据

  1. /**
  2. * 得到 临时凭据
  3. */
  4. private static Credentials getCredentials() throws NoSuchAlgorithmException {
  5. int durationSeconds = 360000;//
  6. //创建签名对象
  7. AssumeRoleProvider provider = new AssumeRoleProvider(
  8. ENDPOINT,
  9. ACCESS_KEY_COMPANY,
  10. SECRET_KEY_COMPANY,
  11. durationSeconds,//默认3600秒失效,设置小于这个就是3600,大于3600就实际值
  12. POLICY_GET_AND_PUT,
  13. REGION,
  14. ROLE_ARN,
  15. ROLE_SESSION_NAME,
  16. null,
  17. null);
  18. Date expirationDate = DateUtil.getDateByAddMinute(new Date(), durationSeconds / 60);
  19. /**
  20. * 打印provider签名属性
  21. */
  22. System.out.println("sessionToken=" + provider.fetch().sessionToken());
  23. System.out.println("accessKey=" + provider.fetch().accessKey());
  24. System.out.println("secretKey=" + provider.fetch().secretKey());
  25. System.out.println("isExpired=" + provider.fetch().isExpired());
  26. System.out.println("expirationDate=" + DateUtil.getDateTimeFormat(expirationDate));
  27. Credentials credentials = provider.fetch();
  28. String sessionToken = provider.fetch().sessionToken();
  29. String accessKey = provider.fetch().accessKey();
  30. String secretKey = provider.fetch().secretKey();
  31. return credentials;
  32. }
  1. // 上传
  2. private static void putObject(File file, String objectName, Credentials credentials) throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
  3. StaticProvider staticProvider = new StaticProvider(credentials.accessKey(), credentials.secretKey(), credentials.sessionToken());
  4. MinioClient minioClient = MinioClient.builder().endpoint(ENDPOINT).credentialsProvider(staticProvider).build();
  5. //这个objectName的值是经过上面的policy授权的
  6. FileInputStream fileInputStream = new FileInputStream(file);
  7. minioClient.putObject(PutObjectArgs.builder().bucket(BUCKET)
  8. .object(objectName)
  9. .contentType("image/jpg")
  10. .stream(fileInputStream, fileInputStream.available(), -1).build());
  11. }
  1. // 获得一个 可过期的 URL
  2. private static String getObjectUrl(String objectName2,Credentials credentials) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, XmlParserException, ServerException {
  3. StaticProvider staticProvider = new StaticProvider(credentials.accessKey(), credentials.secretKey(), credentials.sessionToken());
  4. MinioClient minioClient = MinioClient.builder().endpoint(ENDPOINT).credentialsProvider(staticProvider).build();
  5. String url =
  6. minioClient.getPresignedObjectUrl(
  7. GetPresignedObjectUrlArgs.builder()
  8. .method(Method.GET)
  9. .bucket(BUCKET)
  10. .object(objectName2)
  11. .expiry(2, TimeUnit.HOURS) //过期时间
  12. //.extraQueryParams(reqParams)
  13. .build());
  14. System.out.println(url);
  15. return url;
  16. }

五、参考:

https://blog.csdn.net/yilvqingtai/article/details/126059858https://min.io/docs/minio/linux/developers/java/API.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/182059
推荐阅读
相关标签
  

闽ICP备14008679号