package cc.mrbird.febs.common.interceptor;
|
|
import cc.mrbird.febs.common.annotation.Desensitization;
|
import cc.mrbird.febs.common.entity.DesensitizationType;
|
import lombok.Data;
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.ibatis.cache.CacheKey;
|
import org.apache.ibatis.executor.Executor;
|
import org.apache.ibatis.mapping.BoundSql;
|
import org.apache.ibatis.mapping.MappedStatement;
|
import org.apache.ibatis.plugin.*;
|
import org.apache.ibatis.session.ResultHandler;
|
import org.apache.ibatis.session.RowBounds;
|
|
import java.lang.reflect.Field;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
import java.util.Properties;
|
|
/**
|
* @author MrBird
|
*/
|
@Data
|
@Intercepts({
|
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class,
|
RowBounds.class, ResultHandler.class}),
|
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class,
|
RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),})
|
public class DesensitizationInterceptor implements Interceptor {
|
|
@Override
|
public Object intercept(Invocation invocation) throws Throwable {
|
Object result = invocation.proceed();
|
if (result instanceof ArrayList<?>) {
|
List<?> list = (ArrayList<?>) result;
|
return this.desensitization(list);
|
} else {
|
return this.desensitization(result);
|
}
|
}
|
|
@Override
|
public Object plugin(Object target) {
|
return Plugin.wrap(target, this);
|
}
|
|
@Override
|
public void setProperties(Properties properties) {
|
|
}
|
|
private List<?> desensitization(List<?> list) {
|
Class<?> cls = null;
|
Field[] objFields = null;
|
if (list != null && list.size() > 0) {
|
for (Object o : list) {
|
if (cls == null) {
|
cls = o.getClass();
|
objFields = cls.getDeclaredFields();
|
}
|
desensitizationField(o, objFields);
|
}
|
}
|
return list;
|
}
|
|
private Object desensitization(Object obj) {
|
Class<?> cls;
|
Field[] objFields;
|
if (obj != null) {
|
cls = obj.getClass();
|
objFields = cls.getDeclaredFields();
|
desensitizationField(obj, objFields);
|
}
|
return obj;
|
}
|
|
private void desensitizationField(Object obj, Field[] objFields) {
|
for (Field field : objFields) {
|
Desensitization desensitization;
|
if ("serialVersionUID".equals(field.getName())) {
|
continue;
|
}
|
if (String.class != field.getType() || (desensitization = field.getAnnotation(Desensitization.class)) == null) {
|
continue;
|
}
|
field.setAccessible(true);
|
String value;
|
try {
|
value = field.get(obj) != null ? field.get(obj).toString() : null;
|
} catch (Exception e) {
|
value = null;
|
}
|
if (value == null) {
|
continue;
|
}
|
List<String> regular;
|
DesensitizationType type = desensitization.type();
|
regular = Arrays.asList(type.getRegular());
|
if (regular.size() > 1) {
|
String match = regular.get(0);
|
String result = regular.get(1);
|
if (StringUtils.isNotBlank(match) && StringUtils.isNotBlank(result)) {
|
value = value.replaceAll(match, result);
|
try {
|
field.set(obj, value);
|
} catch (Exception ignore) {
|
}
|
}
|
}
|
}
|
}
|
}
|