package cn.stylefeng.roses.kernel.security.database.interceptor;
|
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.stylefeng.roses.kernel.security.database.algorithm.EncryptAlgorithmApi;
|
import cn.stylefeng.roses.kernel.security.database.annotation.ProtectedData;
|
import cn.stylefeng.roses.kernel.security.database.annotation.ProtectedField;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.ibatis.executor.resultset.ResultSetHandler;
|
import org.apache.ibatis.plugin.*;
|
import org.springframework.core.annotation.AnnotationUtils;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.lang.reflect.Field;
|
import java.sql.Statement;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.Properties;
|
|
/**
|
* Mybatis拦截器,拦截返回参数
|
*
|
* @author majianguo
|
* @date 2021/7/3 11:58
|
*/
|
@Slf4j
|
@Component
|
@Intercepts({@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
|
public class ResultInterceptor implements Interceptor {
|
|
@Resource
|
private EncryptAlgorithmApi encryptAlgorithmApi;
|
|
@Override
|
public Object intercept(Invocation invocation) throws Throwable {
|
|
//取出查询的结果
|
Object resultObject = invocation.proceed();
|
if (Objects.isNull(resultObject)) {
|
return null;
|
}
|
|
// 判断结果是List还是对象
|
if (resultObject instanceof List) {
|
List resultList = (List) resultObject;
|
// 判断是否为空
|
if (ObjectUtil.isNotNull(resultList)) {
|
// 处理数据
|
for (Object result : resultList) {
|
// 对象处理
|
this.objectProcessing(result);
|
}
|
}
|
} else {
|
// 处理单个对象
|
this.objectProcessing(resultObject);
|
}
|
|
return resultObject;
|
}
|
|
/**
|
* 对象处理
|
*
|
* @return
|
* @author majianguo
|
* @date 2021/7/5 9:52
|
**/
|
private void objectProcessing(Object result) throws IllegalAccessException {
|
|
if (result == null) {
|
return;
|
}
|
|
Class<?> resultClass = result.getClass();
|
// 是否加注解了
|
ProtectedData annotation = AnnotationUtils.findAnnotation(resultClass, ProtectedData.class);
|
|
// 加注解就去处理
|
if (ObjectUtil.isNotNull(annotation)) {
|
Field[] declaredFields = resultClass.getDeclaredFields();
|
for (Field field : declaredFields) {
|
// 处理字段
|
this.fieldProcessing(result, field);
|
}
|
}
|
}
|
|
/**
|
* @param result
|
* @param field
|
* @return
|
* @author majianguo
|
* @date 2021/7/5 9:52
|
**/
|
private void fieldProcessing(Object result, Field field) throws IllegalAccessException {
|
if (this.isTag(field)) {
|
field.setAccessible(true);
|
Object object = field.get(result);
|
//String的解密
|
if (object instanceof String) {
|
String value = (String) object;
|
//对注解的字段进行逐一解密
|
try {
|
String decrypt = encryptAlgorithmApi.decrypt(value);
|
field.set(result, decrypt);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
|
/**
|
* 是否注解标记了
|
*
|
* @param field 被判断字段
|
* @return {@link boolean}
|
* @author majianguo
|
* @date 2021/7/5 9:35
|
**/
|
private boolean isTag(Field field) {
|
// 包含其中任意一个即可
|
ProtectedField protectedField = field.getAnnotation(ProtectedField.class);
|
if (ObjectUtil.isNotNull(protectedField)) {
|
return true;
|
}
|
return false;
|
}
|
|
@Override
|
public Object plugin(Object target) {
|
return Plugin.wrap(target, this);
|
}
|
|
@Override
|
public void setProperties(Properties properties) {
|
|
}
|
}
|