package com.dl.framework.manager; import cn.hutool.core.util.ReflectUtil; import com.dl.common.annotation.EncryptField; import com.dl.common.encrypt.EncryptContext; import com.dl.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 encryptorMap = new ConcurrentHashMap<>(); /** * 类加密字段缓存 */ Map, Set> fieldCache = new ConcurrentHashMap<>(); /** * 获取类加密字段缓存 */ public Set getFieldCache(Class sourceClazz) { return fieldCache.computeIfAbsent(sourceClazz, clazz -> { Field[] declaredFields = clazz.getDeclaredFields(); Set 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); } }