2022-12-12 09:37:15 +08:00
|
|
|
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;
|
2022-12-16 09:46:39 +08:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2022-12-12 09:37:15 +08:00
|
|
|
import weaver.hrm.User;
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Field;
|
2022-12-14 13:51:01 +08:00
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
2022-12-12 09:37:15 +08:00
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class EncryptUtil {
|
|
|
|
|
|
|
|
|
|
private SalarySysConfService getSalarySysConfService(User user) {
|
|
|
|
|
return ServiceUtil.getService(SalarySysConfServiceImpl.class, user);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> T encrypt(T data, Class<T> clazz) {
|
2022-12-14 13:51:01 +08:00
|
|
|
if (data == null || clazz == null) {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
2022-12-12 09:37:15 +08:00
|
|
|
boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen();
|
|
|
|
|
if (!encryptIsOpen) {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
try {
|
2022-12-16 09:46:39 +08:00
|
|
|
List<Field> fieldList = getFields(clazz);
|
2022-12-12 09:37:15 +08:00
|
|
|
if (CollectionUtils.isNotEmpty(fieldList)) {
|
|
|
|
|
for (Field field : fieldList) {
|
|
|
|
|
Field declaredField = data.getClass().getDeclaredField(field.getName());
|
|
|
|
|
declaredField.setAccessible(true);
|
|
|
|
|
String fieldValue = (String) declaredField.get(data);
|
|
|
|
|
if (StringUtils.isNotBlank(fieldValue)) {
|
|
|
|
|
String encryptValue = AESEncryptUtil.encrypt(fieldValue);
|
|
|
|
|
declaredField.set(data, encryptValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return data;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("加密异常", e);
|
|
|
|
|
throw new SalaryRunTimeException("加密异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-16 09:46:39 +08:00
|
|
|
@NotNull
|
|
|
|
|
private static <T> List<Field> getFields(Class<T> clazz) {
|
|
|
|
|
List<Class<?>> allClasses = new ArrayList<Class<?>>();
|
|
|
|
|
allClasses.add(clazz);
|
|
|
|
|
Class<?> superClazz;
|
|
|
|
|
while ((superClazz = clazz.getSuperclass()) != null) {
|
|
|
|
|
if (superClazz != Object.class) {
|
|
|
|
|
allClasses.add(superClazz);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
List<Field> fieldList =
|
|
|
|
|
allClasses.stream()
|
|
|
|
|
.map(Class::getDeclaredFields)
|
|
|
|
|
.flatMap(Arrays::stream)
|
|
|
|
|
.filter(field -> field.isAnnotationPresent(Encrypt.class)).collect(Collectors.toList());
|
|
|
|
|
return fieldList;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-12 09:37:15 +08:00
|
|
|
public <T> List<T> encryptList(List<T> dataList, Class<T> clazz) {
|
2022-12-14 13:51:01 +08:00
|
|
|
if (CollectionUtils.isEmpty(dataList) || clazz == null) {
|
|
|
|
|
return dataList;
|
|
|
|
|
}
|
2022-12-12 09:37:15 +08:00
|
|
|
boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen();
|
|
|
|
|
if (!encryptIsOpen) {
|
|
|
|
|
return dataList;
|
|
|
|
|
}
|
|
|
|
|
try {
|
2022-12-16 09:46:39 +08:00
|
|
|
List<Field> fieldList = getFields(clazz);
|
2022-12-12 09:37:15 +08:00
|
|
|
if (CollectionUtils.isNotEmpty(fieldList)) {
|
|
|
|
|
List<Map<String, String>> values = new ArrayList<>();
|
|
|
|
|
for (T data : dataList) {
|
|
|
|
|
for (Field field : fieldList) {
|
|
|
|
|
Field declaredField = data.getClass().getDeclaredField(field.getName());
|
|
|
|
|
declaredField.setAccessible(true);
|
|
|
|
|
String fieldValue = (String) declaredField.get(data);
|
|
|
|
|
if (StringUtils.isNotBlank(fieldValue)) {
|
|
|
|
|
String encryptValue = AESEncryptUtil.encrypt(fieldValue);
|
|
|
|
|
declaredField.set(data, encryptValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return dataList;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("批量加密异常", e);
|
|
|
|
|
throw new SalaryRunTimeException("批量加密异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> T decrypt(T data, Class<T> clazz) {
|
2022-12-14 13:51:01 +08:00
|
|
|
if (data == null || clazz == null) {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
2022-12-12 09:37:15 +08:00
|
|
|
boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen();
|
|
|
|
|
if (!encryptIsOpen) {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
try {
|
2022-12-16 09:46:39 +08:00
|
|
|
List<Field> fieldList = getFields(clazz);
|
2022-12-12 09:37:15 +08:00
|
|
|
if (CollectionUtils.isNotEmpty(fieldList)) {
|
|
|
|
|
for (Field field : fieldList) {
|
|
|
|
|
Field declaredField = data.getClass().getDeclaredField(field.getName());
|
|
|
|
|
declaredField.setAccessible(true);
|
|
|
|
|
String fieldValue = (String) declaredField.get(data);
|
|
|
|
|
if (StringUtils.isNotBlank(fieldValue)) {
|
|
|
|
|
String encryptValue = AESEncryptUtil.decrypt(fieldValue);
|
|
|
|
|
declaredField.set(data, encryptValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return data;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("解密异常", e);
|
|
|
|
|
throw new SalaryRunTimeException("解密异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> List<T> decryptList(List<T> dataList, Class<T> clazz) {
|
2022-12-14 13:51:01 +08:00
|
|
|
if (CollectionUtils.isEmpty(dataList) || clazz == null) {
|
|
|
|
|
return dataList;
|
|
|
|
|
}
|
2022-12-12 09:37:15 +08:00
|
|
|
boolean encryptIsOpen = getSalarySysConfService(null).encryptIsOpen();
|
|
|
|
|
if (!encryptIsOpen) {
|
|
|
|
|
return dataList;
|
|
|
|
|
}
|
|
|
|
|
try {
|
2022-12-16 09:46:39 +08:00
|
|
|
List<Field> fieldList = getFields(clazz);
|
2022-12-12 09:37:15 +08:00
|
|
|
if (CollectionUtils.isNotEmpty(fieldList)) {
|
|
|
|
|
for (T data : dataList) {
|
|
|
|
|
for (Field field : fieldList) {
|
|
|
|
|
Field declaredField = data.getClass().getDeclaredField(field.getName());
|
|
|
|
|
declaredField.setAccessible(true);
|
|
|
|
|
String fieldValue = (String) declaredField.get(data);
|
|
|
|
|
if (StringUtils.isNotBlank(fieldValue)) {
|
|
|
|
|
String encryptValue = AESEncryptUtil.decrypt(fieldValue);
|
|
|
|
|
declaredField.set(data, encryptValue);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return dataList;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("批量解密异常", e);
|
|
|
|
|
throw new SalaryRunTimeException("批量解密异常");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|