/**
* projectName micro-util
* package com.open.util.handler.aspect
* className SensitiveMethod
*
* description: 标注于需要处理的方法上
*
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveMethod {
/**
* 是否启用
*/
boolean enabled() default true;
boolean encParamEnabled() default false;
boolean encResultEnabled() default false;
boolean sensitiveResultEnabled() default true;
Class sensitiveClass() default Integer.class;
SensitiveMapMeta[] sensitiveMapMeta() default {};
}
/**
* projectName micro-util
* package com.open.util.handler.aspect
* className SensitiveMapMeta
*
* description: 标注于需要处理的方法上,当返回类型是map时标注
*
*
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveMapMeta {
String key() default "";
Class sensitiveClass() default Integer.class;
boolean encResultEnabled() default false;
boolean sensitiveResultEnabled() default true;
}
/**
* projectName micro-util
* package com.open.util.handler.aspect
* className EncMeta
*
* description: 标注于需要加密的字段上
*
*
*/
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncMeta {
}
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EncSubMeta {
}
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveMeta {
/**
* 开始替换位置
*/
int rpStart() default 0;
/**
* 结束替换位置
*/
int rpEnd() default 1;
/**
* 替换成的符号
*/
String rpSymbol() default "*";
}
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SensitiveSubMeta {
}
@Slf4j
@Aspect
@Order(Ordered.LOWEST_PRECEDENCE - 100)
@Component
@ConditionalOnProperty(prefix = "open.advice.sensitive", name = "enabled", havingValue = "true")
public class SensitiveInfoAspect {
@Autowired
private List sensitiveManageChain = new CopyOnWriteArrayList<>();
@Autowired
private TransSensitiveFieldProvider transSensitiveField;
@Pointcut("@annotation(com.open.util.entity.annotation.SensitiveMethod)")
private void allAnnotationMethod() {
}
/**
* description: PARAMETER 不支持,所有加密的数据都放到body中
* // Object[] args = point.getArgs();
* // Annotation[][] paramAnnotations = method.getParameterAnnotations();
* // for (int i = 0; i < paramAnnotations.length; i++) {
* // for (int j = 0; j < paramAnnotations[i].length; j++) {
* // Annotation currentAnnotation = paramAnnotations[i][j];
* // Object arg = args[i];
* // if (currentAnnotation instanceof EncMeta && Objects.nonNull(arg) && arg instanceof String) {
* // log.debug("Source args[{}] value {}", i, arg);
* // args[i] = encManager.decField(String.valueOf(arg));
* // }
* // }
* // }
*
* @param point
* @return {@link Object}
* @throws
*/
@Around("allAnnotationMethod()")
public Object doAround(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
SensitiveMethod sensitiveMethodMeta = method.getAnnotation(SensitiveMethod.class);
if (sensitiveMethodMeta.encParamEnabled()) {
ArrayList decFields = new ArrayList<>();
Object[] args = point.getArgs();
Annotation[][] paramAnnotations = method.getParameterAnnotations();
for (int i = 0; i < paramAnnotations.length; i++) {
for (int j = 0; j < paramAnnotations[i].length; j++) {
Annotation currentAnnotation = paramAnnotations[i][j];
Object arg = args[i];
if (currentAnnotation instanceof RequestBody && Objects.nonNull(arg)) {
Field[] fields = arg.getClass().getDeclaredFields();
transSensitiveField.classifyFields(arg.getClass(), fields, decFields, null, null, null);
log.debug("Source args[{}] value {}", i, arg);
decFields.forEach(e -> transSensitiveField.decField(e, arg));
}
}
}
}
Object tempObj = point.proceed();
if (!sensitiveMethodMeta.enabled() || Objects.isNull(tempObj)) {
return tempObj;
}
List sortedChain = sensitiveManageChain.stream()
.sorted(Comparator.comparing(SensitiveManageChain::getOrder)).collect(Collectors.toList());
for (int i = 0; i < sortedChain.size() - 1; i++) {
sortedChain.get(i).setNextChain(sortedChain.get(i + 1));
}
return sortedChain.get(0).sensitiveHand(tempObj, method, sensitiveMethodMeta, null, new ArrayList<>(), new ArrayList<>(),
new ArrayList<>(), new ArrayList<>(), sortedChain);
}
}
java 通过注解、切面、反射实现返回信息脱敏
文章来源:网络 版权归原作者所有,如涉及知识产权问题,请权利人联系我们,我们将立即处理.
推荐阅读 更多精彩内容
-
如题,执行 yarn logs -applicationId 命令时报错 : Exception in thread "main" org.apache.hadoop.yarn.exception.
西行寺え幽幽子 阅读 1013
-
Failed to import the site moduleTraceback (most recent call last): File "/usr/lib/python3.5/site.py"
一生所爱の赫萝 阅读 910
-
链接加上:-L../boost/stage/lib -pthread
上杉夏香 阅读 853
-
filelist.txtfile 'VID_20181219_214101.mp4'file 'VID_20181220_172414.mp4'命令ffmpeg -f concat -i fileli
一生所爱の赫萝 阅读 905
-
1. 烟台自驾游景点推荐在烟台待了这么多年,如果周边游的话可以免费把滨海路刷一遍,说起滨海路就不得不提17路公交,坐17路公交基本能把滨海路所有的景点都逛一遍。其他好的景点我只推荐天崮山,没错,你可能
冰雪殇璃陌梦 阅读 1033
-
1. 北京周边自驾游最美路线很不错的计划,去北京的半路上,可以在山东境内找一景点,回上海时可以走京石公路,沿路再找一景点休息参观。北京许多天津也是廊坊也是沧州的沧县著名清真寺衡水景县一个塔德州一个王陵
上杉夏香 阅读 1031
-
1. 川藏线自驾游开什么车好自驾318川藏线的话,我们可以开越野车,或者是吉普车都是可以的,最好不要开轿车。2. 川藏线自驾轿车合适吗可以。318国道是在中国华东、华中、西南地区的一条国道,起点为上海
血叶洛莉兰 阅读 877
-
1. 张家口坝上草原自驾游攻略坝上秋天夏天都温差大,九月去看秋色时,早晚随时零度。如果你是个摄影人需要早晚日出日落去创作,穿上羽绒就没错,别说秋天了,夏天早上都经常只有十度八度。配图第一张是我们在坝上
一生所爱の赫萝 阅读 1037
-
1. 西安周边自驾游排行榜西安周边自驾游好玩的地方有宝鸡关山牧场,秦岭沣峪口,蓝天县白鹿原影视城,泾阳县乐华娱乐城,泾阳茯茶小镇,兴平马嵬驿,兴平宏兴码头观光园,临潼区华清池,兵马俑,骊山,华阴县华山
一生所爱の赫萝 阅读 923