package com.se.simu.service.Impl; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm; import cn.hutool.crypto.asymmetric.AsymmetricCrypto; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; import com.alibaba.fastjson.JSONObject; import com.se.simu.constant.CacheConstants; import com.se.simu.domain.EntityTypeInfo; import com.se.simu.domain.LoginParams; import com.se.simu.helper.CaffeineHelper; import com.se.simu.service.ProjectRelatedService; import com.se.simu.utils.CustomWebClient; import com.se.simu.utils.EntityLibraryUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; import java.security.KeyPair; import java.security.PrivateKey; import java.security.PublicKey; import java.util.HashMap; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; @Slf4j @Service public class ProjectRelatedServiceImpl implements ProjectRelatedService { // 公钥地址 @Value(value = "${app-server.publicKeyUrl}") private String publicKeyUrl; // devops 登录地址 @Value(value = "${app-server.loginUrl}") private String loginUrl; @Value(value = "${app-server.getDbUrl}") private String getDbUrl; // 查询地址 @Value(value = "${app-server.queryUrl}") private String queryUrl; /** * 获取公钥 * * @return {@link Object} */ @Override public Object getPublicKey() { HashMap headers = new HashMap<>(); headers.put("Content-Type", "application/json"); CompletableFuture postResponse = CustomWebClient.postAsFuture(publicKeyUrl, "", headers, String.class); // 异步处理响应 postResponse.thenAccept(response -> { log.info("response: {}", response); if (response.contains("code")) { try { JSONObject postResponseJson = JSONObject.parseObject(response); int statusCode = postResponseJson.getIntValue("code"); log.info("statusCode = " + statusCode); String data = postResponseJson.getString("data"); // 缓存data,并设置1小时有效期 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "rsa_data_set"); CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "rsa_data_set", data); log.info("publicKey = " + data); } catch (Exception e) { log.info("Failed to parse JSON: " + e.getMessage()); } } else { log.info("No 'code' field in the response: " + response); } }); return JSONObject.parseObject(postResponse.join()); } /** * 登录实体 * * @param loginParams 登录参数 * @return {@link String} */ @Override public Object loginEntity(LoginParams loginParams) { // 判断redis中缓存是否存在(过期) boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token")); if (!isExists) { return JSONObject.parseObject((String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_response")); } else { // 清除所有缓存 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_response"); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityPublicKey"); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token"); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "rsa_data_set"); } // 获取私钥和公钥,长度必须是16、24或32 String publicKey = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "rsa_data_set"); // 假设从Redis中获取到用户名,判断 if (!StringUtils.isNotBlank(publicKey) && Objects.isNull(publicKey)) { // 缓存中没有用户名,则进行登录 getPublicKey(); log.info("调用了登录获取用户名方法 $= "); } // 防止主线程提前结束 try { // 等待异步请求完成 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } publicKey = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "rsa_data_set"); log.info("publicKey = " + publicKey); // 公钥加密 AsymmetricCrypto rsa = SecureUtil.rsa(null, publicKey); String encrypt = rsa.encryptBase64(loginParams.getPassword(), KeyType.PublicKey); // 设置加密后的密码 loginParams.setPassword(encrypt); // 将loginParams实体转成JSON字符串 // String json = JSON.toJSONString(loginParams); // log.info("json = " + json); // 发送登录请求 Mono postResponse = CustomWebClient.postAsMono(loginUrl, loginParams, String.class); // 用于保存响应数据 AtomicReference responseData = new AtomicReference<>(); postResponse.subscribe(response -> { // 将响应数据保存到变量中 responseData.set(response); String code = JSONObject.parseObject(response).getString("code"); // 如果code是200则登录成功 if (code.equals("200")) { // 登录成功后,获取data String data = JSONObject.parseObject(response).getString("data"); String token = JSONObject.parseObject(data).getString("token"); log.info("token = " + token); // 设置data到Redis中 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_response"); CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_response", response); // 设置data到Redis中 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token"); CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_token", token); } else { // 登录失败 log.error("登录失败 $= " + response); } }); // 防止主线程提前结束 try { postResponse.toFuture().get(); // 阻塞等待订阅操作完成 // 等待异步请求完成 Thread.sleep(1000); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } // 返回token return JSONObject.parseObject(responseData.get()); } /** * 自定义密钥生成加密数据 * * @param data 数据 * @param publicKey 公钥 * @return {@link String} */ private static String customKeysGenerateEncryptedData(String data, String publicKey) { AsymmetricCrypto rsa = SecureUtil.rsa(null, publicKey); String encrypt = rsa.encryptBase64(data, KeyType.PublicKey); System.out.println("encrypt = " + encrypt); return encrypt; } /** * 自定义 RSAgenerate 加密数据0 */ private static void customRSAGenerateEncryptedData0() { RSA rsa = new RSA(); // 获取公钥和私钥 System.out.println(rsa.getPublicKey()); System.out.println(rsa.getPrivateKeyBase64()); System.out.println(rsa.getPrivateKey()); System.out.println(rsa.getPrivateKeyBase64()); // 私钥加密,公钥解密 System.out.println(new String(rsa.encrypt("testaa", KeyType.PrivateKey))); System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PrivateKey), KeyType.PublicKey))); // 公钥加密,私钥解密 System.out.println(new String(rsa.encrypt("testaa", KeyType.PublicKey))); System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PublicKey), KeyType.PrivateKey))); } /** * 自定义 RSAgenerate 加密数据1 */ private static void customRSAGenerateEncryptedData1() { KeyPair keyPair = SecureUtil.generateKeyPair(AsymmetricAlgorithm.RSA.getValue()); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); System.out.println(publicKey); System.out.println(privateKey); System.out.println("----------"); RSA rsa = new RSA(privateKey, publicKey); // 私钥加密,公钥解密 System.out.println(new String(rsa.encrypt("testaa", KeyType.PrivateKey))); System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PrivateKey), KeyType.PublicKey))); // 公钥加密,私钥解密 System.out.println(new String(rsa.encrypt("testaa", KeyType.PublicKey))); System.out.println(new String(rsa.decrypt(rsa.encrypt("testaa", KeyType.PublicKey), KeyType.PrivateKey))); } /** * 获取访问实体库的token * * @return {@link Object} */ @Override public Object getEntityPublicKey() { // 判断redis中缓存是否存在(过期) boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "EntityPublicKey")); if (!isExists) { return JSONObject.parseObject((String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "EntityPublicKey")); } else { // 清除所有缓存 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_response"); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityPublicKey"); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token"); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "rsa_data_set"); } HashMap headers = new HashMap<>(); headers.put("Content-Type", "application/json"); CompletableFuture postResponse = CustomWebClient.postAsFuture(queryUrl, "", headers, String.class); // 异步处理响应 postResponse.thenAccept(response -> { log.info("response: {}", response); if (response.contains("code")) { try { JSONObject postResponseJson = JSONObject.parseObject(response); int statusCode = postResponseJson.getIntValue("code"); log.info("statusCode = " + statusCode); String data = postResponseJson.getString("data"); // 缓存data,并设置1小时有效期 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityPublicKey"); CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "EntityPublicKey", response); log.info("EntityPublicKey = " + data); } catch (Exception e) { log.info("Failed to parse JSON: " + e.getMessage()); } } else { log.info("No 'code' field in the response: " + response); } }); return JSONObject.parseObject(postResponse.join()); } /** * 获取访问实体库的token * * @return {@link Object} */ @Override public Object getDbLits() { HashMap headers = new HashMap<>(); headers.put("Content-Type", "application/json"); String token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"); log.info("token = " + token); // 添加form参数 HashMap params = new HashMap<>(); params.put("token", token); CompletableFuture postResponse = CustomWebClient.postAsFuture(getDbUrl, params, headers, String.class); // 异步处理响应 postResponse.thenAccept(response -> { log.info("response: {}", response); if (response.contains("code")) { try { JSONObject postResponseJson = JSONObject.parseObject(response); int statusCode = postResponseJson.getIntValue("code"); log.info("statusCode = " + statusCode); String data = postResponseJson.getString("data"); // 缓存data,并设置1小时有效期 CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "EntityDbNameList"); CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "EntityDbNameList", response); log.info("EntityDbNameList = " + data); } catch (Exception e) { log.info("Failed to parse JSON: " + e.getMessage()); } } else { log.info("No 'code' field in the response: " + response); } }); return JSONObject.parseObject(postResponse.join()); } @Override public Object getEntityTypeInfo(EntityTypeInfo entityTypeInfo) { HashMap headers = new HashMap<>(); headers.put("Content-Type", "application/json"); String token; // 判断redis中缓存是否存在(过期) boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token")); if (!isExists) { token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"); } else { try { token = EntityLibraryUtils.login(); CaffeineHelper.remove(CacheConstants.USER_CACHE_KEY + "entity_db_token"); CaffeineHelper.put(CacheConstants.USER_CACHE_KEY + "entity_db_token", token); }catch (Exception e){ return "登录失败!"; } } log.info("token = " + token); // 添加form参数 HashMap params = new HashMap<>(); params.put("token", token); params.put("start", Objects.nonNull(entityTypeInfo.getStart()) ? entityTypeInfo.getStart() : 1); params.put("containCount", true); params.put("count", Objects.nonNull(entityTypeInfo.getCount()) ? entityTypeInfo.getCount() : 20); params.put("dbid", Objects.nonNull(entityTypeInfo.getDbid()) ? entityTypeInfo.getDbid() : "85257774fdb64e5f99f6778696cad02a"); params.put("layerid", Objects.nonNull(entityTypeInfo.getLayerid()) ? entityTypeInfo.getLayerid() : "8208c5be-adc1-4e7b-b952-37362e0bef32"); params.put("like", ""); params.put("querytype", "entity"); CompletableFuture postResponse = CustomWebClient.postAsFuture(queryUrl, params, headers, String.class); // 异步处理响应 postResponse.thenAccept(response -> { log.info("response: {}", response); if (response.contains("code")) { try { JSONObject postResponseJson = JSONObject.parseObject(response); int statusCode = postResponseJson.getIntValue("code"); log.info("statusCode = " + statusCode); String data = postResponseJson.getString("data"); log.info("getEntityTypeInfo = " + data); } catch (Exception e) { log.info("Failed to parse JSON: " + e.getMessage()); } } else { log.info("No 'code' field in the response: " + response); } }); return JSONObject.parseObject(postResponse.join()); } @Override public Object getEntityPipeInfo(EntityTypeInfo entityTypeInfo) { HashMap headers = new HashMap<>(); headers.put("Content-Type", "application/json"); String token; // 判断redis中缓存是否存在(过期) boolean isExists = Objects.isNull(CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token")); if (!isExists) { token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"); } else { // 获取token LoginParams loginParams = new LoginParams(); loginParams.setUserid("admin"); loginParams.setPassword("admin"); loginEntity(loginParams); token = (String) CaffeineHelper.get(CacheConstants.USER_CACHE_KEY + "entity_db_token"); } log.info("token = " + token); // 添加form参数 HashMap params = new HashMap<>(); // e7e2af87096c45e0a14c0a4855cb0b90 params.put("token", token); params.put("start", Objects.nonNull(entityTypeInfo.getStart()) ? entityTypeInfo.getStart() : 1); params.put("containCount", true); params.put("count", Objects.nonNull(entityTypeInfo.getCount()) ? entityTypeInfo.getCount() : 20); params.put("dbid", Objects.nonNull(entityTypeInfo.getDbid()) ? entityTypeInfo.getDbid() : "85257774fdb64e5f99f6778696cad02a"); params.put("layerid", Objects.nonNull(entityTypeInfo.getLayerid()) ? entityTypeInfo.getLayerid() : "1e677d48-8dff-4975-b9a0-c16500193629"); params.put("like", ""); params.put("querytype", "entity"); CompletableFuture postResponse = CustomWebClient.postAsFuture(queryUrl, params, headers, String.class); // 异步处理响应 postResponse.thenAccept(response -> { log.info("response: {}", response); if (response.contains("code")) { try { JSONObject postResponseJson = JSONObject.parseObject(response); int statusCode = postResponseJson.getIntValue("code"); log.info("statusCode = " + statusCode); String data = postResponseJson.getString("data"); log.info("getEntityTypeInfo = " + data); } catch (Exception e) { log.info("Failed to parse JSON: " + e.getMessage()); } } else { log.info("No 'code' field in the response: " + response); } }); return JSONObject.parseObject(postResponse.join()); } }