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<String, String> headers = new HashMap<>();
|
headers.put("Content-Type", "application/json");
|
CompletableFuture<String> 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<String> postResponse = CustomWebClient.postAsMono(loginUrl, loginParams, String.class);
|
// 用于保存响应数据
|
AtomicReference<String> 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<String, String> headers = new HashMap<>();
|
headers.put("Content-Type", "application/json");
|
CompletableFuture<String> 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<String, String> 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<String, Object> params = new HashMap<>();
|
params.put("token", token);
|
|
CompletableFuture<String> 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<String, String> 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<String, Object> 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<String> 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<String, String> 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<String, Object> 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<String> 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());
|
}
|
|
|
}
|