diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java new file mode 100644 index 00000000..0922835f --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java @@ -0,0 +1,10 @@ +package cd.casic.ci.process.constant; + +public class SastUrlConstant { + // 本地使用vpn调用内网ip + public static final String baseUrl="http://192.168.31.93"; + // 远程服务调用 外网ip +// public static final String baseUrl="http://39.155.212.109:22880"; + // 获取token + public static final String getToken="/api/login/noCaptcha"; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/TokenResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/TokenResp.java new file mode 100644 index 00000000..df65e417 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/TokenResp.java @@ -0,0 +1,12 @@ +package cd.casic.ci.process.dto.resp.sast; + +import lombok.Data; + +@Data +public class TokenResp { + private String accessToken; + private Integer expiresIn; + private Integer refreshExpiresIn; + private String refreshToken; + private String tokenType; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java new file mode 100644 index 00000000..e2ebc9fa --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java @@ -0,0 +1,7 @@ +package cd.casic.ci.process.process.service.sast; + +import cd.casic.ci.process.dto.resp.sast.TokenResp; + +public interface SastService { + String getToken(); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java new file mode 100644 index 00000000..86537b85 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java @@ -0,0 +1,69 @@ +package cd.casic.ci.process.process.service.sast.impl; + +import cd.casic.ci.process.constant.SastUrlConstant; +import cd.casic.ci.process.dto.resp.sast.TokenResp; +import cd.casic.ci.process.process.service.sast.SastService; +import cd.casic.ci.process.properties.SastProperties; +import cd.casic.framework.redis.core.RedisTemplateUtils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +import static cd.casic.ci.process.constant.SastUrlConstant.*; + +@Service +public class SastServiceImpl implements SastService { + @Resource + private RedisTemplateUtils redisTemplateUtils; + @Resource + private SastProperties sastProperties; + @Resource + private RestTemplate restTemplate; + public static final String tokenPrefix = "Bearer"; + public static final String tokenHeaderKey = "authorization"; + public static final String REDIS_SAST_TOKEN_KEY = "REDIS_SAST_TOKEN_KEY"; + + private TokenResp getTokenRemote(){ + HttpHeaders httpHeaders = new HttpHeaders(); + HttpEntity httpEntity = new HttpEntity(sastProperties,httpHeaders); + ResponseEntity exchange = restTemplate.exchange(baseUrl+getToken, HttpMethod.POST, httpEntity, String.class, new HashMap<>()); + String body = exchange.getBody(); + JSONObject bodyObject = JSON.parseObject(body); + TokenResp tokenResp = new TokenResp(); + tokenResp.setAccessToken(bodyObject.getString("access_token")); + tokenResp.setExpiresIn(bodyObject.getInteger("expires_in")); + tokenResp.setRefreshExpiresIn(bodyObject.getInteger("refresh_expires_in")); + tokenResp.setRefreshToken(bodyObject.getString("refresh_token")); + tokenResp.setTokenType(bodyObject.getString("token_type")); + return tokenResp; + } + + @Override + public String getToken() { + Object o = redisTemplateUtils.get(REDIS_SAST_TOKEN_KEY); + String token = o instanceof String ? ((String) o) : ""; + if (StringUtils.isEmpty(token)) { + synchronized(this){ + o = redisTemplateUtils.get(REDIS_SAST_TOKEN_KEY); + token = o instanceof String ? ((String) o) : ""; + if (StringUtils.isEmpty(token)) { + TokenResp tokenRemote = getTokenRemote(); + String accessToken = tokenRemote.getAccessToken(); + redisTemplateUtils.set(REDIS_SAST_TOKEN_KEY,accessToken,tokenRemote.getExpiresIn()*1000); + token = accessToken; + } + } + } + return token; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/properties/SastProperties.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/properties/SastProperties.java new file mode 100644 index 00000000..dc2477db --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/properties/SastProperties.java @@ -0,0 +1,21 @@ +package cd.casic.ci.process.properties; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Component; + +@ConfigurationProperties(prefix = "sast") +@Component +@Data +public class SastProperties { + @Value("username") + private String username; + @Value("password") + private String password; + @Value("id") + private String id; + @Value("captcha") + private String captcha; +} diff --git a/ops-server/src/main/resources/application-local.yaml b/ops-server/src/main/resources/application-local.yaml index 76a240b0..4a482ee9 100644 --- a/ops-server/src/main/resources/application-local.yaml +++ b/ops-server/src/main/resources/application-local.yaml @@ -70,7 +70,9 @@ spring: # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 data: redis: - host: 127.0.0.1 # 地址 +# host: 127.0.0.1 # 地址 +# port: 16379 # 端口 + host: 192.168.1.120 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 # password: dev # 密码,建议生产环境开启 @@ -156,3 +158,8 @@ logging: org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # 禁用,Spring Boot 3.X 存在部分错误的 WARN 提示 debug: false +sast: + username: admin@clouditera.com + password: Aa123456 + id: clouditera + captcha: clouditera diff --git a/ops-server/src/test/java/cd/casic/server/SastTest.java b/ops-server/src/test/java/cd/casic/server/SastTest.java new file mode 100644 index 00000000..70c78a1a --- /dev/null +++ b/ops-server/src/test/java/cd/casic/server/SastTest.java @@ -0,0 +1,70 @@ +package cd.casic.server; + +import cd.casic.ci.process.dto.resp.sast.TokenResp; +import cd.casic.ci.process.process.service.sast.SastService; +import cd.casic.ci.process.properties.SastProperties; +import cd.casic.framework.redis.core.RedisTemplateUtils; +import com.alibaba.fastjson.JSON; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.test.context.ActiveProfiles; + +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +@SpringBootTest(classes = {OpsServerApplication.class}) +@ActiveProfiles("local") +@Slf4j +public class SastTest { + @Resource + SastProperties sastProperties; + @Resource + SastService sastService; + @Resource + ThreadPoolTaskExecutor workerExecutor; + @Resource + RedisTemplateUtils redisTemplateUtils; + @Test + public void properties(){ + System.out.println(JSON.toJSONString(sastProperties)); + } + @Test + public void getToken(){ + String token = sastService.getToken(); + System.out.println(token); + } + @Test + public void getTokenThread(){ + + CyclicBarrier cyclicBarrier = new CyclicBarrier(2); + String token1 = ""; + String token2 = ""; + redisTemplateUtils.del("REDIS_SAST_TOKEN_KEY"); + workerExecutor.submit(()->{ + try { + cyclicBarrier.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } catch (BrokenBarrierException e) { + throw new RuntimeException(e); + } + log.info(sastService.getToken()); + }); + workerExecutor.submit(()->{ + try { + cyclicBarrier.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } catch (BrokenBarrierException e) { + throw new RuntimeException(e); + } + log.info(sastService.getToken()); + }); + } + +}