package com.engine.salary.encrypt; import com.engine.common.util.ServiceUtil; import com.engine.salary.annotation.Encrypt; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.sys.service.SalarySysConfService; import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import weaver.hrm.User; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Slf4j public class EncryptUtil { private static final String NULL = "null"; private static String ifNull(String value){ if (NULL.equals(value)) { return null; } return value; } private SalarySysConfService getSalarySysConfService(User user) { return ServiceUtil.getService(SalarySysConfServiceImpl.class, user); } public T encrypt(T data, Class clazz) { if (data == null || clazz == null) { return data; } boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); if (!encryptIsOpen) { return data; } try { List fieldList = getFields(clazz); if (CollectionUtils.isNotEmpty(fieldList)) { for (Field field : fieldList) { field.setAccessible(true); String fieldValue = (String)field.get(data); if (StringUtils.isNotBlank(fieldValue)) { String encryptValue = AESEncryptUtil.encrypt(fieldValue); field.set(data, encryptValue); } } } return data; } catch (Exception e) { log.error("加密异常", e); throw new SalaryRunTimeException("加密异常"); } } @NotNull private static List getFields(Class clazz) { List> allClasses = new ArrayList>(); for (Class superClass = clazz; superClass != null; superClass = superClass.getSuperclass()) { if (superClass != Object.class) { allClasses.add(superClass); } } List fieldList = allClasses.stream() .map(Class::getDeclaredFields) .flatMap(Arrays::stream) .filter(field -> field.isAnnotationPresent(Encrypt.class)).collect(Collectors.toList()); return fieldList; } public List encryptList(List dataList, Class clazz) { if (CollectionUtils.isEmpty(dataList) || clazz == null) { return dataList; } boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); if (!encryptIsOpen) { return dataList; } try { List fieldList = getFields(clazz); if (CollectionUtils.isNotEmpty(fieldList)) { for (T data : dataList) { for (Field field : fieldList) { field.setAccessible(true); String fieldValue = (String) field.get(data); if (StringUtils.isNotBlank(fieldValue)) { String encryptValue = AESEncryptUtil.encrypt(fieldValue); field.set(data, encryptValue); } } } } return dataList; } catch (Exception e) { log.error("批量加密异常", e); throw new SalaryRunTimeException("批量加密异常"); } } public T decrypt(T data, Class clazz) { if (data == null || clazz == null) { return data; } boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); if (!encryptIsOpen) { return data; } try { List fieldList = getFields(clazz); if (CollectionUtils.isNotEmpty(fieldList)) { for (Field field : fieldList) { field.setAccessible(true); String fieldValue = (String) field.get(data); if (StringUtils.isNotBlank(fieldValue)) { String encryptValue = ifNull(AESEncryptUtil.decrypt(fieldValue)); field.set(data, encryptValue); } } } return data; } catch (Exception e) { log.error("解密异常", e); throw new SalaryRunTimeException("解密异常"); } } public List decryptList(List dataList, Class clazz) { if (CollectionUtils.isEmpty(dataList) || clazz == null) { return dataList; } boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen(); if (!encryptIsOpen) { return dataList; } try { List fieldList = getFields(clazz); if (CollectionUtils.isNotEmpty(fieldList)) { for (T data : dataList) { for (Field field : fieldList) { field.setAccessible(true); String fieldValue = (String) field.get(data); if (StringUtils.isNotBlank(fieldValue)) { String encryptValue = ifNull(AESEncryptUtil.decrypt(fieldValue)); field.set(data, encryptValue); } } } } return dataList; } catch (Exception e) { log.error("批量解密异常", e); throw new SalaryRunTimeException("批量解密异常"); } } }