StsServiceImpl.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package com.fdkankan.cloud.acl.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.thread.ThreadUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONObject;
  9. import com.aliyun.oss.ClientBuilderConfiguration;
  10. import com.aliyun.oss.OSS;
  11. import com.aliyun.oss.OSSClient;
  12. import com.aliyun.oss.OSSClientBuilder;
  13. import com.aliyun.oss.common.auth.CredentialsProviderFactory;
  14. import com.aliyun.oss.common.utils.BinaryUtil;
  15. import com.aliyun.oss.model.MatchMode;
  16. import com.aliyun.oss.model.PolicyConditions;
  17. import com.aliyun.sts20150401.Client;
  18. import com.aliyun.sts20150401.models.AssumeRoleRequest;
  19. import com.aliyun.sts20150401.models.AssumeRoleResponse;
  20. import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
  21. import com.aliyun.teautil.models.RuntimeOptions;
  22. import com.aliyuncs.auth.EnvironmentVariableCredentialsProvider;
  23. import com.fdkankan.cloud.acl.bean.StsBean;
  24. import com.fdkankan.cloud.acl.constant.RedisKey;
  25. import com.fdkankan.cloud.acl.entity.AppConfig;
  26. import com.fdkankan.cloud.acl.service.IAppConfigService;
  27. import com.fdkankan.cloud.acl.service.IStsService;
  28. import com.fdkankan.common.constant.ErrorCode;
  29. import com.fdkankan.common.constant.ServerCode;
  30. import com.fdkankan.common.exception.BusinessException;
  31. import com.fdkankan.common.util.DateExtUtil;
  32. import com.fdkankan.redis.util.RedisUtil;
  33. import com.mybatisflex.core.query.QueryWrapper;
  34. import lombok.extern.slf4j.Slf4j;
  35. import org.springframework.beans.factory.annotation.Autowired;
  36. import org.springframework.beans.factory.annotation.Value;
  37. import org.springframework.stereotype.Service;
  38. import com.aliyun.tea.*;
  39. import java.io.File;
  40. import java.time.Instant;
  41. import java.time.ZoneId;
  42. import java.time.ZonedDateTime;
  43. import java.time.format.DateTimeFormatter;
  44. import java.util.*;
  45. import java.util.concurrent.ThreadPoolExecutor;
  46. @Slf4j
  47. @Service
  48. public class StsServiceImpl implements IStsService {
  49. @Autowired
  50. private IAppConfigService appConfigService;
  51. @Autowired
  52. private Client stsClient;
  53. @Autowired
  54. private RedisUtil redisUtil;
  55. public static void main(String[] args) throws Exception {
  56. // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
  57. com.aliyun.teaopenapi.models.Config config =
  58. new com.aliyun.teaopenapi.models.Config()
  59. // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
  60. .setAccessKeyId("LTAI5tJnqRzcURptuSVnG57Z")
  61. // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
  62. .setAccessKeySecret("1RomdGaoay2ABIUVSHOMG5HclPWw8D")
  63. .setEndpoint("sts.cn-shenzhen.aliyuncs.com");
  64. // Endpoint 请参考 https://api.aliyun.com/product/Sts
  65. Client stsClient = new Client(config);
  66. com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
  67. .setDurationSeconds(3600L)
  68. .setRoleArn("acs:ram::1899912233141089:role/server-sts")
  69. .setRoleSessionName("app_user");
  70. //设置权限,如果为空,则默认跟随rolearn的权限
  71. // if(StrUtil.isNotEmpty(appConfig.getPolicy())){
  72. // assumeRoleRequest.setPolicy(appConfig.getPolicy());
  73. // }
  74. for (int i = 0; i < 200; i++){
  75. new Thread(new Runnable() {
  76. @Override
  77. public void run() {
  78. RuntimeOptions runtime = new RuntimeOptions();
  79. AssumeRoleResponse resp = null;
  80. while (Objects.isNull(resp)){
  81. resp = get(assumeRoleRequest, runtime);
  82. if(Objects.isNull(resp)){
  83. try {
  84. Thread.sleep(500L);
  85. } catch (InterruptedException e) {
  86. throw new RuntimeException(e);
  87. }
  88. }
  89. }
  90. System.out.println(JSON.toJSONString(resp));
  91. }
  92. public AssumeRoleResponse get(AssumeRoleRequest assumeRoleRequest, RuntimeOptions runtime){
  93. AssumeRoleResponse assumeRoleResponse = null;
  94. try {
  95. assumeRoleResponse = stsClient.assumeRoleWithOptions(assumeRoleRequest, runtime);
  96. } catch (Exception e) {
  97. System.out.println("请求失败");
  98. }
  99. return assumeRoleResponse;
  100. }
  101. }).start();
  102. }
  103. }
  104. @Override
  105. public StsBean genAssumeRole(String appCode) {
  106. AppConfig appConfig = appConfigService.getByAppCode(appCode);
  107. com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
  108. .setRoleArn(appConfig.getRoleArn())
  109. .setRoleSessionName(appConfig.getRoleSessionName());
  110. //设置权限,如果为空,则默认跟随rolearn的权限
  111. if(StrUtil.isNotEmpty(appConfig.getPolicy())){
  112. assumeRoleRequest.setPolicy(appConfig.getPolicy());
  113. }
  114. if(Objects.nonNull(appConfig.getDurationSeconds())){
  115. assumeRoleRequest.setDurationSeconds(appConfig.getDurationSeconds());
  116. }
  117. com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
  118. com.aliyun.sts20150401.models.AssumeRoleResponse resp = null;
  119. int index = 1;
  120. while (Objects.isNull(resp)){
  121. try {
  122. resp = stsClient.assumeRoleWithOptions(assumeRoleRequest, runtime);
  123. } catch (Exception e) {
  124. log.error("请求阿里云sts接口失败", e);
  125. }
  126. if(++index > 10 || Objects.nonNull(resp)){
  127. break;
  128. }
  129. ThreadUtil.sleep(200L);
  130. }
  131. if(Objects.isNull(resp)){
  132. throw new BusinessException(ErrorCode.SYSTEM_BUSY);
  133. }
  134. String accessKeyId = resp.getBody().getCredentials().getAccessKeyId();
  135. String accessKeySecret = resp.getBody().getCredentials().getAccessKeySecret();
  136. String securityToken = resp.getBody().getCredentials().getSecurityToken();
  137. String expiration = this.converToBjTime(resp.getBody().getCredentials().getExpiration());
  138. long expirTimestamp = DateUtil.parse(expiration, DateExtUtil.dateStyle).getTime()/1000;
  139. return StsBean.builder().accessKeyId(accessKeyId).accessKeySecret(accessKeySecret).securityToken(securityToken).expiration(expiration).expirTimestamp(expirTimestamp).build();
  140. }
  141. public String converToBjTime(String dateStr) {
  142. Instant utcTime = Instant.parse(dateStr);
  143. ZoneId beijingZoneId = ZoneId.of("Asia/Shanghai");
  144. ZonedDateTime beijingTime = utcTime.atZone(beijingZoneId);
  145. return beijingTime.format(DateTimeFormatter.ofPattern(DateExtUtil.dateStyle));
  146. }
  147. @Override
  148. public StsBean getAssumeRole(String appCode) {
  149. //调用阿里云接口生成
  150. StsBean stsBean = this.genAssumeRole(appCode);
  151. return stsBean;
  152. }
  153. }