32 changed files with 444 additions and 237 deletions
-
13tp-admin/src/main/java/com/inscloudtech/web/controller/system/SysProfileController.java
-
2tp-admin/src/main/resources/application.yml
-
29tp-common/src/main/java/com/inscloudtech/common/core/domain/dto/SysUserPasswordBo.java
-
2tp-common/src/main/java/com/inscloudtech/common/encrypt/annotation/ApiEncrypt.java
-
7tp-common/src/main/java/com/inscloudtech/common/encrypt/annotation/EncryptField.java
-
8tp-common/src/main/java/com/inscloudtech/common/encrypt/config/ApiDecryptAutoConfiguration.java
-
49tp-common/src/main/java/com/inscloudtech/common/encrypt/config/EncryptorAutoConfiguration.java
-
6tp-common/src/main/java/com/inscloudtech/common/encrypt/core/EncryptContext.java
-
158tp-common/src/main/java/com/inscloudtech/common/encrypt/core/EncryptorManager.java
-
6tp-common/src/main/java/com/inscloudtech/common/encrypt/core/IEncryptor.java
-
6tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/AbstractEncryptor.java
-
10tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/AesEncryptor.java
-
11tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/Base64Encryptor.java
-
10tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/RsaEncryptor.java
-
11tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/Sm2Encryptor.java
-
10tp-common/src/main/java/com/inscloudtech/common/encrypt/core/encryptor/Sm4Encryptor.java
-
7tp-common/src/main/java/com/inscloudtech/common/encrypt/enumd/AlgorithmType.java
-
2tp-common/src/main/java/com/inscloudtech/common/encrypt/enumd/EncodeType.java
-
16tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/CryptoFilter.java
-
4tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/DecryptRequestBodyWrapper.java
-
9tp-common/src/main/java/com/inscloudtech/common/encrypt/filter/EncryptResponseBodyWrapper.java
-
30tp-common/src/main/java/com/inscloudtech/common/encrypt/interceptor/MybatisDecryptInterceptor.java
-
32tp-common/src/main/java/com/inscloudtech/common/encrypt/interceptor/MybatisEncryptInterceptor.java
-
4tp-common/src/main/java/com/inscloudtech/common/encrypt/properties/ApiDecryptProperties.java
-
8tp-common/src/main/java/com/inscloudtech/common/encrypt/properties/EncryptorProperties.java
-
2tp-common/src/main/java/com/inscloudtech/common/encrypt/utils/EncryptUtils.java
-
1tp-common/src/main/java/com/inscloudtech/common/filter/RepeatedlyRequestWrapper.java
-
3tp-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
-
39tp-framework/src/main/java/com/inscloudtech/framework/config/EncryptorConfig.java
-
18tp-framework/src/main/java/com/inscloudtech/framework/handler/AllUrlHandler.java
-
96tp-framework/src/main/java/com/inscloudtech/framework/manager/EncryptorManager.java
-
72tp-functional/src/test/java/JvmMemoryTest.java
@ -0,0 +1,29 @@ |
|||||
|
package com.inscloudtech.common.core.domain.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
|
||||
|
import javax.validation.constraints.NotBlank; |
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* 用户密码修改bo |
||||
|
*/ |
||||
|
@Data |
||||
|
public class SysUserPasswordBo implements Serializable { |
||||
|
|
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
/** |
||||
|
* 旧密码 |
||||
|
*/ |
||||
|
@NotBlank(message = "旧密码不能为空") |
||||
|
private String oldPassword; |
||||
|
|
||||
|
/** |
||||
|
* 新密码 |
||||
|
*/ |
||||
|
@NotBlank(message = "新密码不能为空") |
||||
|
private String newPassword; |
||||
|
} |
@ -1,4 +1,4 @@ |
|||||
package com.inscloudtech.framework.encrypt; |
|
||||
|
package com.inscloudtech.common.encrypt.annotation; |
||||
|
|
||||
import java.lang.annotation.*; |
import java.lang.annotation.*; |
||||
|
|
@ -1,7 +1,8 @@ |
|||||
package com.inscloudtech.common.annotation; |
|
||||
|
package com.inscloudtech.common.encrypt.annotation; |
||||
|
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
|
|
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
|
||||
import java.lang.annotation.*; |
import java.lang.annotation.*; |
||||
|
|
@ -0,0 +1,49 @@ |
|||||
|
package com.inscloudtech.common.encrypt.config; |
||||
|
|
||||
|
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; |
||||
|
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties; |
||||
|
import com.inscloudtech.common.encrypt.core.EncryptorManager; |
||||
|
import com.inscloudtech.common.encrypt.interceptor.MybatisDecryptInterceptor; |
||||
|
import com.inscloudtech.common.encrypt.interceptor.MybatisEncryptInterceptor; |
||||
|
import com.inscloudtech.common.encrypt.properties.EncryptorProperties; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration; |
||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
|
||||
|
/** |
||||
|
* 加解密配置 |
||||
|
* |
||||
|
* @author 老马 |
||||
|
* @version 4.6.0 |
||||
|
*/ |
||||
|
@AutoConfiguration(after = MybatisPlusAutoConfiguration.class) |
||||
|
@EnableConfigurationProperties(EncryptorProperties.class) |
||||
|
@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") |
||||
|
@Slf4j |
||||
|
public class EncryptorAutoConfiguration { |
||||
|
|
||||
|
@Autowired |
||||
|
private EncryptorProperties properties; |
||||
|
|
||||
|
@Bean |
||||
|
public EncryptorManager encryptorManager(MybatisPlusProperties mybatisPlusProperties) { |
||||
|
return new EncryptorManager(mybatisPlusProperties.getTypeAliasesPackage()); |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { |
||||
|
return new MybatisEncryptInterceptor(encryptorManager, properties); |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { |
||||
|
return new MybatisDecryptInterceptor(encryptorManager, properties); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
@ -1,7 +1,7 @@ |
|||||
package com.inscloudtech.common.encrypt; |
|
||||
|
package com.inscloudtech.common.encrypt.core; |
||||
|
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
import lombok.Data; |
import lombok.Data; |
||||
|
|
||||
/** |
/** |
@ -0,0 +1,158 @@ |
|||||
|
package com.inscloudtech.common.encrypt.core; |
||||
|
|
||||
|
import cn.hutool.core.collection.CollUtil; |
||||
|
import cn.hutool.core.util.ObjectUtil; |
||||
|
import cn.hutool.core.util.ReflectUtil; |
||||
|
import com.inscloudtech.common.encrypt.annotation.EncryptField; |
||||
|
import com.inscloudtech.common.utils.StringUtils; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.apache.ibatis.io.Resources; |
||||
|
import org.springframework.context.ConfigurableApplicationContext; |
||||
|
import org.springframework.core.io.Resource; |
||||
|
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; |
||||
|
import org.springframework.core.io.support.ResourcePatternResolver; |
||||
|
import org.springframework.core.type.ClassMetadata; |
||||
|
import org.springframework.core.type.classreading.CachingMetadataReaderFactory; |
||||
|
import org.springframework.util.ClassUtils; |
||||
|
|
||||
|
import java.lang.reflect.Field; |
||||
|
import java.util.*; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
/** |
||||
|
* 加密管理类 |
||||
|
* |
||||
|
* @author 老马 |
||||
|
* @version 4.6.0 |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
@NoArgsConstructor |
||||
|
public class EncryptorManager { |
||||
|
|
||||
|
/** |
||||
|
* 缓存加密器 |
||||
|
*/ |
||||
|
Map<EncryptContext, IEncryptor> encryptorMap = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
/** |
||||
|
* 类加密字段缓存 |
||||
|
*/ |
||||
|
Map<Class<?>, Set<Field>> fieldCache = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
/** |
||||
|
* 构造方法传入类加密字段缓存 |
||||
|
* |
||||
|
* @param typeAliasesPackage 实体类包 |
||||
|
*/ |
||||
|
public EncryptorManager(String typeAliasesPackage) { |
||||
|
scanEncryptClasses(typeAliasesPackage); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 获取类加密字段缓存 |
||||
|
*/ |
||||
|
public Set<Field> getFieldCache(Class<?> sourceClazz) { |
||||
|
if (ObjectUtil.isNotNull(fieldCache)) { |
||||
|
return fieldCache.get(sourceClazz); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 注册加密执行者到缓存 |
||||
|
* |
||||
|
* @param encryptContext 加密执行者需要的相关配置参数 |
||||
|
*/ |
||||
|
public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { |
||||
|
if (encryptorMap.containsKey(encryptContext)) { |
||||
|
return encryptorMap.get(encryptContext); |
||||
|
} |
||||
|
IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); |
||||
|
encryptorMap.put(encryptContext, encryptor); |
||||
|
return encryptor; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 移除缓存中的加密执行者 |
||||
|
* |
||||
|
* @param encryptContext 加密执行者需要的相关配置参数 |
||||
|
*/ |
||||
|
public void removeEncryptor(EncryptContext encryptContext) { |
||||
|
this.encryptorMap.remove(encryptContext); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 |
||||
|
* |
||||
|
* @param value 待加密的值 |
||||
|
* @param encryptContext 加密相关的配置信息 |
||||
|
*/ |
||||
|
public String encrypt(String value, EncryptContext encryptContext) { |
||||
|
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
||||
|
return encryptor.encrypt(value, encryptContext.getEncode()); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据配置进行解密 |
||||
|
* |
||||
|
* @param value 待解密的值 |
||||
|
* @param encryptContext 加密相关的配置信息 |
||||
|
*/ |
||||
|
public String decrypt(String value, EncryptContext encryptContext) { |
||||
|
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
||||
|
return encryptor.decrypt(value); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 通过 typeAliasesPackage 设置的扫描包 扫描缓存实体 |
||||
|
*/ |
||||
|
private void scanEncryptClasses(String typeAliasesPackage) { |
||||
|
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); |
||||
|
CachingMetadataReaderFactory factory = new CachingMetadataReaderFactory(); |
||||
|
String[] packagePatternArray = StringUtils.splitPreserveAllTokens(typeAliasesPackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); |
||||
|
String classpath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX; |
||||
|
try { |
||||
|
for (String packagePattern : packagePatternArray) { |
||||
|
String path = ClassUtils.convertClassNameToResourcePath(packagePattern); |
||||
|
Resource[] resources = resolver.getResources(classpath + path + "/*.class"); |
||||
|
for (Resource resource : resources) { |
||||
|
ClassMetadata classMetadata = factory.getMetadataReader(resource).getClassMetadata(); |
||||
|
Class<?> clazz = Resources.classForName(classMetadata.getClassName()); |
||||
|
Set<Field> encryptFieldSet = getEncryptFieldSetFromClazz(clazz); |
||||
|
if (CollUtil.isNotEmpty(encryptFieldSet)) { |
||||
|
fieldCache.put(clazz, encryptFieldSet); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
log.error("初始化数据安全缓存时出错:{}", e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获得一个类的加密字段集合 |
||||
|
*/ |
||||
|
private Set<Field> getEncryptFieldSetFromClazz(Class<?> clazz) { |
||||
|
Set<Field> fieldSet = new HashSet<>(); |
||||
|
// 判断clazz如果是接口,内部类,匿名类就直接返回 |
||||
|
if (clazz.isInterface() || clazz.isMemberClass() || clazz.isAnonymousClass()) { |
||||
|
return fieldSet; |
||||
|
} |
||||
|
while (clazz != null) { |
||||
|
Field[] fields = clazz.getDeclaredFields(); |
||||
|
fieldSet.addAll(Arrays.asList(fields)); |
||||
|
clazz = clazz.getSuperclass(); |
||||
|
} |
||||
|
fieldSet = fieldSet.stream().filter(field -> |
||||
|
field.isAnnotationPresent(EncryptField.class) && field.getType() == String.class) |
||||
|
.collect(Collectors.toSet()); |
||||
|
for (Field field : fieldSet) { |
||||
|
field.setAccessible(true); |
||||
|
} |
||||
|
return fieldSet; |
||||
|
} |
||||
|
|
||||
|
} |
@ -1,7 +1,7 @@ |
|||||
package com.inscloudtech.common.encrypt; |
|
||||
|
package com.inscloudtech.common.encrypt.core; |
||||
|
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
|
||||
/** |
/** |
||||
* 加解者 |
* 加解者 |
@ -1,7 +1,7 @@ |
|||||
package com.inscloudtech.common.encrypt.encryptor; |
|
||||
|
package com.inscloudtech.common.encrypt.core.encryptor; |
||||
|
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.encrypt.IEncryptor; |
|
||||
|
import com.inscloudtech.common.encrypt.core.EncryptContext; |
||||
|
import com.inscloudtech.common.encrypt.core.IEncryptor; |
||||
|
|
||||
/** |
/** |
||||
* 所有加密执行者的基类 |
* 所有加密执行者的基类 |
@ -1,9 +1,9 @@ |
|||||
package com.inscloudtech.common.encrypt.encryptor; |
|
||||
|
package com.inscloudtech.common.encrypt.core.encryptor; |
||||
|
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
import com.inscloudtech.common.encrypt.core.EncryptContext; |
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
|
|
||||
/** |
/** |
||||
* AES算法实现 |
* AES算法实现 |
@ -1,9 +1,10 @@ |
|||||
package com.inscloudtech.common.encrypt.encryptor; |
|
||||
|
package com.inscloudtech.common.encrypt.core.encryptor; |
||||
|
|
||||
|
import com.inscloudtech.common.encrypt.core.EncryptContext; |
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
|
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
|
||||
/** |
/** |
||||
* Base64算法实现 |
* Base64算法实现 |
@ -1,9 +1,9 @@ |
|||||
package com.inscloudtech.common.encrypt.encryptor; |
|
||||
|
package com.inscloudtech.common.encrypt.core.encryptor; |
||||
|
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
import com.inscloudtech.common.encrypt.core.EncryptContext; |
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
import com.inscloudtech.common.utils.StringUtils; |
import com.inscloudtech.common.utils.StringUtils; |
||||
|
|
||||
|
|
@ -1,10 +1,9 @@ |
|||||
package com.inscloudtech.common.encrypt.encryptor; |
|
||||
|
package com.inscloudtech.common.encrypt.core.encryptor; |
||||
|
|
||||
|
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
import com.inscloudtech.common.encrypt.core.EncryptContext; |
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
import com.inscloudtech.common.utils.StringUtils; |
import com.inscloudtech.common.utils.StringUtils; |
||||
|
|
||||
/** |
/** |
@ -1,9 +1,9 @@ |
|||||
package com.inscloudtech.common.encrypt.encryptor; |
|
||||
|
package com.inscloudtech.common.encrypt.core.encryptor; |
||||
|
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.enums.AlgorithmType; |
|
||||
import com.inscloudtech.common.enums.EncodeType; |
|
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
import com.inscloudtech.common.encrypt.core.EncryptContext; |
||||
|
import com.inscloudtech.common.encrypt.enumd.AlgorithmType; |
||||
|
import com.inscloudtech.common.encrypt.enumd.EncodeType; |
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
|
|
||||
/** |
/** |
||||
* sm4算法实现 |
* sm4算法实现 |
@ -1,4 +1,4 @@ |
|||||
package com.inscloudtech.common.enums; |
|
||||
|
package com.inscloudtech.common.encrypt.enumd; |
||||
|
|
||||
/** |
/** |
||||
* 编码类型 |
* 编码类型 |
@ -1,9 +1,9 @@ |
|||||
package com.inscloudtech.framework.filter; |
|
||||
|
package com.inscloudtech.common.encrypt.filter; |
||||
|
|
||||
import cn.hutool.core.io.IoUtil; |
import cn.hutool.core.io.IoUtil; |
||||
|
|
||||
import com.inscloudtech.common.constant.Constants; |
import com.inscloudtech.common.constant.Constants; |
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
import org.springframework.http.MediaType; |
import org.springframework.http.MediaType; |
||||
|
|
||||
import javax.servlet.ReadListener; |
import javax.servlet.ReadListener; |
@ -1,17 +1,14 @@ |
|||||
package com.inscloudtech.framework.filter; |
|
||||
|
package com.inscloudtech.common.encrypt.filter; |
||||
|
|
||||
import cn.hutool.core.util.RandomUtil; |
import cn.hutool.core.util.RandomUtil; |
||||
import com.inscloudtech.common.utils.EncryptUtils; |
|
||||
|
import com.inscloudtech.common.encrypt.utils.EncryptUtils; |
||||
|
|
||||
|
|
||||
import javax.servlet.ServletOutputStream; |
import javax.servlet.ServletOutputStream; |
||||
import javax.servlet.WriteListener; |
import javax.servlet.WriteListener; |
||||
import javax.servlet.http.HttpServletResponse; |
import javax.servlet.http.HttpServletResponse; |
||||
import javax.servlet.http.HttpServletResponseWrapper; |
import javax.servlet.http.HttpServletResponseWrapper; |
||||
import java.io.ByteArrayOutputStream; |
|
||||
import java.io.IOException; |
|
||||
import java.io.OutputStreamWriter; |
|
||||
import java.io.PrintWriter; |
|
||||
|
import java.io.*; |
||||
import java.nio.charset.StandardCharsets; |
import java.nio.charset.StandardCharsets; |
||||
|
|
||||
/** |
/** |
@ -1,15 +1,13 @@ |
|||||
package com.inscloudtech.framework.config.properties; |
|
||||
|
package com.inscloudtech.common.encrypt.properties; |
||||
|
|
||||
import lombok.Data; |
import lombok.Data; |
||||
import org.springframework.boot.context.properties.ConfigurationProperties; |
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
/** |
/** |
||||
* api解密属性配置类 |
* api解密属性配置类 |
||||
* @author wdhcr |
* @author wdhcr |
||||
*/ |
*/ |
||||
@Data |
@Data |
||||
@Component |
|
||||
@ConfigurationProperties(prefix = "api-decrypt") |
@ConfigurationProperties(prefix = "api-decrypt") |
||||
public class ApiDecryptProperties { |
public class ApiDecryptProperties { |
||||
|
|
@ -1,4 +1,4 @@ |
|||||
package com.inscloudtech.common.utils; |
|
||||
|
package com.inscloudtech.common.encrypt.utils; |
||||
|
|
||||
import cn.hutool.core.codec.Base64; |
import cn.hutool.core.codec.Base64; |
||||
import cn.hutool.core.util.ArrayUtil; |
import cn.hutool.core.util.ArrayUtil; |
@ -0,0 +1,3 @@ |
|||||
|
com.inscloudtech.common.encrypt.config.EncryptorAutoConfiguration |
||||
|
com.inscloudtech.common.encrypt.config.ApiDecryptAutoConfiguration |
||||
|
|
@ -1,39 +0,0 @@ |
|||||
package com.inscloudtech.framework.config; |
|
||||
|
|
||||
import com.inscloudtech.framework.config.properties.EncryptorProperties; |
|
||||
import com.inscloudtech.framework.manager.EncryptorManager; |
|
||||
import com.inscloudtech.framework.encrypt.MybatisDecryptInterceptor; |
|
||||
import com.inscloudtech.framework.encrypt.MybatisEncryptInterceptor; |
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
|
||||
import org.springframework.context.annotation.Bean; |
|
||||
import org.springframework.context.annotation.Configuration; |
|
||||
|
|
||||
/** |
|
||||
* 加解密配置 |
|
||||
* |
|
||||
* @author 老马 |
|
||||
* @version 4.6.0 |
|
||||
*/ |
|
||||
@Configuration |
|
||||
@ConditionalOnProperty(value = "mybatis-encryptor.enable", havingValue = "true") |
|
||||
public class EncryptorConfig { |
|
||||
|
|
||||
@Autowired |
|
||||
private EncryptorProperties properties; |
|
||||
|
|
||||
@Bean |
|
||||
public EncryptorManager encryptorManager() { |
|
||||
return new EncryptorManager(); |
|
||||
} |
|
||||
|
|
||||
@Bean |
|
||||
public MybatisEncryptInterceptor mybatisEncryptInterceptor(EncryptorManager encryptorManager) { |
|
||||
return new MybatisEncryptInterceptor(encryptorManager, properties); |
|
||||
} |
|
||||
|
|
||||
@Bean |
|
||||
public MybatisDecryptInterceptor mybatisDecryptInterceptor(EncryptorManager encryptorManager) { |
|
||||
return new MybatisDecryptInterceptor(encryptorManager, properties); |
|
||||
} |
|
||||
} |
|
@ -1,96 +0,0 @@ |
|||||
package com.inscloudtech.framework.manager; |
|
||||
|
|
||||
import cn.hutool.core.util.ReflectUtil; |
|
||||
import com.inscloudtech.common.annotation.EncryptField; |
|
||||
import com.inscloudtech.common.encrypt.EncryptContext; |
|
||||
import com.inscloudtech.common.encrypt.IEncryptor; |
|
||||
import lombok.extern.slf4j.Slf4j; |
|
||||
|
|
||||
import java.lang.reflect.Field; |
|
||||
import java.util.Arrays; |
|
||||
import java.util.Map; |
|
||||
import java.util.Set; |
|
||||
import java.util.concurrent.ConcurrentHashMap; |
|
||||
import java.util.stream.Collectors; |
|
||||
|
|
||||
/** |
|
||||
* 加密管理类 |
|
||||
* |
|
||||
* @author 老马 |
|
||||
* @version 4.6.0 |
|
||||
*/ |
|
||||
@Slf4j |
|
||||
public class EncryptorManager { |
|
||||
|
|
||||
/** |
|
||||
* 缓存加密器 |
|
||||
*/ |
|
||||
Map<EncryptContext, IEncryptor> encryptorMap = new ConcurrentHashMap<>(); |
|
||||
|
|
||||
/** |
|
||||
* 类加密字段缓存 |
|
||||
*/ |
|
||||
Map<Class<?>, Set<Field>> fieldCache = new ConcurrentHashMap<>(); |
|
||||
|
|
||||
/** |
|
||||
* 获取类加密字段缓存 |
|
||||
*/ |
|
||||
public Set<Field> getFieldCache(Class<?> sourceClazz) { |
|
||||
return fieldCache.computeIfAbsent(sourceClazz, clazz -> { |
|
||||
Field[] declaredFields = clazz.getDeclaredFields(); |
|
||||
Set<Field> fieldSet = Arrays.stream(declaredFields).filter(field -> |
|
||||
field.isAnnotationPresent(EncryptField.class) && field.getType() == String.class) |
|
||||
.collect(Collectors.toSet()); |
|
||||
for (Field field : fieldSet) { |
|
||||
field.setAccessible(true); |
|
||||
} |
|
||||
return fieldSet; |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 注册加密执行者到缓存 |
|
||||
* |
|
||||
* @param encryptContext 加密执行者需要的相关配置参数 |
|
||||
*/ |
|
||||
public IEncryptor registAndGetEncryptor(EncryptContext encryptContext) { |
|
||||
if (encryptorMap.containsKey(encryptContext)) { |
|
||||
return encryptorMap.get(encryptContext); |
|
||||
} |
|
||||
IEncryptor encryptor = ReflectUtil.newInstance(encryptContext.getAlgorithm().getClazz(), encryptContext); |
|
||||
encryptorMap.put(encryptContext, encryptor); |
|
||||
return encryptor; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 移除缓存中的加密执行者 |
|
||||
* |
|
||||
* @param encryptContext 加密执行者需要的相关配置参数 |
|
||||
*/ |
|
||||
public void removeEncryptor(EncryptContext encryptContext) { |
|
||||
this.encryptorMap.remove(encryptContext); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 根据配置进行加密。会进行本地缓存对应的算法和对应的秘钥信息。 |
|
||||
* |
|
||||
* @param value 待加密的值 |
|
||||
* @param encryptContext 加密相关的配置信息 |
|
||||
*/ |
|
||||
public String encrypt(String value, EncryptContext encryptContext) { |
|
||||
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
|
||||
return encryptor.encrypt(value, encryptContext.getEncode()); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 根据配置进行解密 |
|
||||
* |
|
||||
* @param value 待解密的值 |
|
||||
* @param encryptContext 加密相关的配置信息 |
|
||||
*/ |
|
||||
public String decrypt(String value, EncryptContext encryptContext) { |
|
||||
IEncryptor encryptor = this.registAndGetEncryptor(encryptContext); |
|
||||
return encryptor.decrypt(value); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -0,0 +1,72 @@ |
|||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
public class JvmMemoryTest { |
||||
|
//声明缓存对象 |
||||
|
private static final Map map = new HashMap(); |
||||
|
|
||||
|
public static void main(String args[]){ |
||||
|
try { |
||||
|
Thread.sleep(100000);//给打开visualvm时间 |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
//循环添加对象到缓存 |
||||
|
for(int i=0; i<1000000;i++){ |
||||
|
TestMemory t = new TestMemory(); |
||||
|
map.put("key"+i,t); |
||||
|
} |
||||
|
System.out.println("first"); |
||||
|
//为dump出堆提供时间 |
||||
|
try { |
||||
|
Thread.sleep(10000); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
for(int i=0; i<1000000;i++){ |
||||
|
TestMemory t = new TestMemory(); |
||||
|
map.put("key"+i,t); |
||||
|
} |
||||
|
System.out.println("second"); |
||||
|
try { |
||||
|
Thread.sleep(10000); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
for(int i=0; i<3000000;i++){ |
||||
|
TestMemory t = new TestMemory(); |
||||
|
map.put("key"+i,t); |
||||
|
} |
||||
|
System.out.println("third"); |
||||
|
try { |
||||
|
Thread.sleep(10000); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
for(int i=0; i<4000000;i++){ |
||||
|
TestMemory t = new TestMemory(); |
||||
|
map.put("key"+i,t); |
||||
|
} |
||||
|
System.out.println("forth"); |
||||
|
try { |
||||
|
Thread.sleep(Integer.MAX_VALUE); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
System.out.println("qqqq"); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
class TestMemory { |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue