通过注解、切面、反射实现返回信息脱敏(二)

简介: 通过注解、切面、反射实现返回信息脱敏
/*** projectName micro-util* package  com.open.util.handler.provider* className TransSensitiveFieldProvider* <p>* description: 敏感字段转换* </p>** @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:31*/@Slf4j@Component@ConditionalOnProperty(prefix="open.advice.sensitive", name="enabled", havingValue="true")
publicclassTransSensitiveFieldProvider {
@AutowiredprivateSensitiveEncProvidersensitiveEncProvider;
@SuppressWarnings("unchecked")
publicvoidcollectionObjSensitive(ArrayListcollectionObj, List<Field>senFields) {
collectionObj.forEach(eleObj->senFields.forEach(senField->sensitiveField(senField, eleObj)));
    }
@SuppressWarnings("unchecked")
publicvoidcollectionObjEnc(ArrayListcollectionObj, List<Field>encFields) {
collectionObj.forEach(eleObj->encFields.forEach(encField->encField(encField, eleObj)));
    }
publicvoidsensitiveField(FieldsenField, Objecttarget) {
try {
senField.setAccessible(true);
ObjecttempFieldValue=senField.get(target);
StringstringTempFieldValue=String.valueOf(tempFieldValue);
StringnullStr="null";
if (Objects.nonNull(stringTempFieldValue) &&!Objects.equals(nullStr, stringTempFieldValue)) {
SensitiveMetasensitiveMeta=senField.getAnnotation(SensitiveMeta.class);
intend=Math.min(stringTempFieldValue.length(), sensitiveMeta.rpEnd());
StringsubStr=stringTempFieldValue.substring(sensitiveMeta.rpStart(), end);
senField.set(target, stringTempFieldValue.replace(subStr, sensitiveMeta.rpSymbol()));
            }
        } catch (IllegalAccessExceptionex) {
log.error("Sensitive catch exception:", ex);
        }
    }
publicvoidencField(FieldencField, Objecttarget) {
try {
encField.setAccessible(true);
ObjecttempFieldValue=encField.get(target);
StringstringTempFieldValue=String.valueOf(tempFieldValue);
StringnullStr="null";
if (Objects.nonNull(stringTempFieldValue) &&!Objects.equals(nullStr, stringTempFieldValue)) {
StringaftEncValue=sensitiveEncProvider.encField(stringTempFieldValue);
encField.set(target, aftEncValue);
            }
        } catch (Exceptionex) {
log.error("Enc field catch exception:", ex);
        }
    }
publicvoiddecField(FielddecField, Objecttarget) {
try {
decField.setAccessible(true);
ObjecttempFieldValue=decField.get(target);
StringstringTempFieldValue=String.valueOf(tempFieldValue);
StringnullStr="null";
if (Objects.nonNull(stringTempFieldValue) &&!Objects.equals(nullStr, stringTempFieldValue)) {
StringaftEncValue=sensitiveEncProvider.decField(stringTempFieldValue);
decField.set(target, aftEncValue);
            }
        } catch (Exceptionex) {
log.error("Dec field catch exception:", ex);
        }
    }
publicvoidclassifyFields(Class<?>sourceClass, Field[] fields, ArrayList<Field>encFields,
ArrayList<Field>senFields, ArrayList<Field>subEncFields, ArrayList<Field>subSenFields) {
List<Field>fieldList=Stream.of(fields).collect(Collectors.toList());
if (sourceClass.isAnnotationPresent(SensitiveMeta.class)) {
if (Objects.nonNull(senFields)) {
senFields.addAll(fieldList);
            }
fieldList.forEach(e-> {
if (e.isAnnotationPresent(SensitiveSubMeta.class) &&Objects.nonNull(senFields)) {
senFields.remove(e);
                }
if (e.isAnnotationPresent(SensitiveSubMeta.class) &&Objects.nonNull(subSenFields)) {
subSenFields.add(e);
                }
            });
        }
if (sourceClass.isAnnotationPresent(EncMeta.class)) {
if (!CollectionUtils.isEmpty(encFields)) {
encFields.addAll(fieldList);
            }
fieldList.forEach(e-> {
if (e.isAnnotationPresent(EncSubMeta.class) &&Objects.nonNull(encFields)) {
encFields.remove(e);
                }
if (e.isAnnotationPresent(EncSubMeta.class) &&Objects.nonNull(subEncFields)) {
subEncFields.add(e);
                }
            });
        }
fieldList.forEach(e-> {
booleanannotationSenPresent=e.isAnnotationPresent(SensitiveMeta.class) &&!sourceClass.isAnnotationPresent(SensitiveMeta.class);
booleanannotationEncPresent=e.isAnnotationPresent(EncMeta.class) &&!sourceClass.isAnnotationPresent(EncMeta.class);
if (annotationEncPresent&&annotationSenPresent) {
encFields.add(e);
senFields.add(e);
            } elseif (annotationEncPresent) {
encFields.add(e);
            } elseif (annotationSenPresent) {
senFields.add(e);
            }
        });
    }
}






/*** projectName micro-util* package com.open.util.handler.aspect.sensitive4chain* className SensitiveManageChain* <p>* description:* </p>** @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:17*/publicinterfaceSensitiveManageChainextendsOrdered {
/*** description:** @param sourceResult  原返回结果* @param method        当前处理方法* @param sensitiveMeta 敏感信息方法元数据* @param sourceMapMeta* @param senFields     敏感字段集合* @param encFields     加密字段集合* @param subEncFields* @param subSenFields* @param sortedChain   有序链路* @return {@link Object} 处理后的返回结果* @throws* @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:19*/ObjectsensitiveHand(ObjectsourceResult, Methodmethod, SensitiveMethodsensitiveMeta, SensitiveMapMetasourceMapMeta, ArrayList<Field>senFields, ArrayList<Field>encFields, ArrayList<Field>subEncFields, ArrayList<Field>subSenFields, List<SensitiveManageChain>sortedChain);
/*** description: 设置下一个链路** @param chain 下一个链路* @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:42*/voidsetNextChain(SensitiveManageChainchain);
}






/*** projectName micro-util* package com.open.util.handler.aspect.sensitive4chain* className CollectionResultHandler* <p>* description:* </p>** @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 10:05*/@Data@Slf4j@Component@ConditionalOnProperty(prefix="open.advice.sensitive", name="enabled", havingValue="true")
publicclassCollectionManageChainimplementsSensitiveManageChain {
privateintorder;
privateSensitiveManageChainnextChain;
@AutowiredprivateTransSensitiveFieldProvidertransSensitiveField;
/*** description:** @param sourceResult  原返回结果* @param method        当前处理方法* @param sensitiveMeta 敏感信息方法元数据* @param sourceMapMeta* @param senFields     敏感字段集合* @param encFields     加密字段集合* @param subEncFields* @param subSenFields* @param sortedChain   有序链路* @return {@link Object} 处理后的返回结果* @throws* @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:19*/@Override@SuppressWarnings("unchecked")
publicObjectsensitiveHand(ObjectsourceResult, Methodmethod, SensitiveMethodsensitiveMeta, SensitiveMapMetasourceMapMeta, ArrayList<Field>senFields, ArrayList<Field>encFields,
ArrayList<Field>subEncFields, ArrayList<Field>subSenFields, List<SensitiveManageChain>sortedChain) {
if (Objects.isNull(sourceResult)) {
returnnull;
        }
if (sourceResultinstanceofCollection) {
ArrayListcollectionObj=newArrayList();
ClasssensitiveClass=Objects.nonNull(sourceMapMeta) ?sourceMapMeta.sensitiveClass() : sensitiveMeta.sensitiveClass();
if (Objects.equals(sensitiveClass, Integer.class)) {
log.warn("Return collection need to config sensitiveClass() ,but not found method {},please check you config.", method);
returnsourceResult;
            }
Field[] fields=sensitiveClass.getDeclaredFields();
if (fields.length<=0) {
returnsourceResult;
            }
Collectioncollection= (Collection) sourceResult;
if (!CollectionUtils.isEmpty(collection)) {
collectionObj.addAll(collection);
            }
transSensitiveField.classifyFields(sensitiveClass, fields, encFields, senFields, subEncFields, subSenFields);
booleansenResultEnabled=Objects.nonNull(sourceMapMeta) ?sourceMapMeta.sensitiveResultEnabled() : sensitiveMeta.sensitiveResultEnabled();
if (sensitiveMeta.sensitiveResultEnabled() &&!CollectionUtils.isEmpty(senFields)) {
transSensitiveField.collectionObjSensitive(collectionObj, senFields);
            }
if (sensitiveMeta.encResultEnabled() &&!CollectionUtils.isEmpty(encFields)) {
transSensitiveField.collectionObjEnc(collectionObj, encFields);
            }
returncollectionObj;
        }
if (Objects.isNull(nextChain)) {
returnsourceResult;
        }
returnnextChain.sensitiveHand(sourceResult, method, sensitiveMeta, sourceMapMeta, senFields, encFields, subEncFields, subSenFields, sortedChain);
    }
}






/*** projectName micro-util* package com.open.util.handler.aspect.sensitive4chain* classname  PageManageChain* <p>* description* </p>** @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/22 23:09*/@Data@Slf4j@Component@ConditionalOnProperty(prefix="open.advice.sensitive", name="enabled", havingValue="true")
publicclassPageManageChainimplementsSensitiveManageChain {
privateintorder;
privateSensitiveManageChainnextChain;
@AutowiredprivateTransSensitiveFieldProvidertransSensitiveField;
/*** description:** @param sourceResult  原返回结果* @param method        当前处理方法* @param sensitiveMeta 敏感信息方法元数据* @param sourceMapMeta* @param senFields     敏感字段集合* @param encFields     加密字段集合* @param sortedChain   有序链路* @return {@link Object} 处理后的返回结果* @throws* @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:19*/@Override@SuppressWarnings("unchecked")
publicObjectsensitiveHand(ObjectsourceResult, Methodmethod, SensitiveMethodsensitiveMeta, SensitiveMapMetasourceMapMeta, ArrayList<Field>senFields, ArrayList<Field>encFields,
ArrayList<Field>subEncFields, ArrayList<Field>subSenFields, List<SensitiveManageChain>sortedChain) {
if (Objects.isNull(sourceResult)) {
returnnull;
        }
if (sourceResultinstanceofPage) {
ArrayListcollectionObj=newArrayList();
Pageablepageable;
longtotal;
ClasssensitiveClass=sensitiveMeta.sensitiveClass();
if (Objects.equals(sensitiveClass, Integer.class)) {
log.warn("Return page need to config SensitiveMethod.sensitiveClass() ,but not found method {},please check you config.", method);
returnsourceResult;
            }
Field[] fields=sensitiveMeta.sensitiveClass().getDeclaredFields();
if (fields.length<=0) {
returnsourceResult;
            }
PageModelpageResult= (PageModel) sourceResult;
total=pageResult.getTotal();
pageable=pageResult.getPageable();
Collectioncollection=pageResult.getContent();
if (!CollectionUtils.isEmpty(collection)) {
collectionObj.addAll(collection);
            }
transSensitiveField.classifyFields(sourceResult.getClass(), fields, encFields, senFields, subEncFields, subSenFields);
if (sensitiveMeta.sensitiveResultEnabled() &&!CollectionUtils.isEmpty(senFields)) {
transSensitiveField.collectionObjSensitive(collectionObj, senFields);
returnPageModel.pageSuccess(collectionObj, pageable, total);
            }
if (sensitiveMeta.encResultEnabled() &&!CollectionUtils.isEmpty(encFields)) {
transSensitiveField.collectionObjEnc(collectionObj, encFields);
            }
        }
if (Objects.isNull(nextChain)) {
returnsourceResult;
        }
returnnextChain.sensitiveHand(sourceResult, method, sensitiveMeta, sourceMapMeta, senFields, encFields,
subEncFields, subSenFields, sortedChain);
    }
}




/*** projectName micro-util* package com.open.util.handler.aspect.sensitive4chain* className GenericManageChain* <p>* description:* </p>** @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 10:12*/@Data@Slf4j@Component@ConditionalOnProperty(prefix="open.advice.sensitive", name="enabled", havingValue="true")
publicclassGenericManageChainimplementsSensitiveManageChain {
privateintorder=Ordered.LOWEST_PRECEDENCE-1000;
privateSensitiveManageChainnextChain=null;
@AutowiredprivateTransSensitiveFieldProvidertransSensitiveField;
/*** description:** @param sourceResult  原返回结果* @param method        当前处理方法* @param sensitiveMeta 敏感信息方法元数据* @param sourceMapMeta* @param senFields     敏感字段集合* @param encFields     加密字段集合* @param subEncFields* @param subSenFields* @param sortedChain   有序链路* @return {@link Object} 处理后的返回结果* @throws* @author <a href="mailto:joshualwork@163.com">joshua_liu</a>* @date 2021/12/21 9:19*/@OverridepublicObjectsensitiveHand(ObjectsourceResult, Methodmethod, SensitiveMethodsensitiveMeta, SensitiveMapMetasourceMapMeta, ArrayList<Field>senFields, ArrayList<Field>encFields,
ArrayList<Field>subEncFields, ArrayList<Field>subSenFields, List<SensitiveManageChain>sortedChain) {
if (Objects.isNull(sourceResult)) {
returnnull;
        }
Class<?>sourceClass=sourceResult.getClass();
Field[] fields=sourceResult.getClass().getDeclaredFields();
if (fields.length<=0) {
returnsourceResult;
        }
transSensitiveField.classifyFields(sourceClass, fields, encFields, senFields, subEncFields, subSenFields);
if (sensitiveMeta.sensitiveResultEnabled()) {
senFields.forEach(field->transSensitiveField.sensitiveField(field, sourceResult));
        }
if (sensitiveMeta.encResultEnabled()) {
encFields.forEach(field->transSensitiveField.encField(field, sourceResult));
        }
returnsourceResult;
    }
}
相关文章
|
7月前
|
Java 开发者
Java 中的 toString() 方法详解:为什么它如此重要?
在Java开发中,`toString()`方法至关重要,用于返回对象的字符串表示。默认实现仅输出类名和哈希码,信息有限且不直观。通过重写`toString()`,可展示对象字段值,提升调试效率与代码可读性。借助Lombok的`@Data`注解,能自动生成标准化的`toString()`方法,简化开发流程,尤其适合字段较多的场景。合理运用`toString()`,可显著提高开发效率与代码质量。
586 0
|
小程序
微信小程序阻止事件冒泡
微信小程序阻止事件冒泡
498 0
|
安全 算法 程序员
在go语言中使用泛型和反射
【7月更文挑战第8天】本文介绍go支持泛型后,提升了代码复用,如操作切片、映射、通道的函数,以及自定义数据结构。 泛型适用于通用数据结构和函数,减少接口使用和类型断言。
282 1
在go语言中使用泛型和反射
|
12月前
|
网络协议 安全 物联网
网络安全涨知识:基础网络攻防之DDoS攻击
网络安全涨知识:基础网络攻防之DDoS攻击
707 0
|
XML Java Maven
MockedStatic 用于模拟静态方法
`MockedStatic` 是 Mockito 3.4.0 版本引入的一个功能,用于模拟静态方法。在之前的 Mockito 版本中,模拟静态方法是一项困难的任务,通常需要借助其他工具如 PowerMockito。但是,从 Mockito 3.4.0 开始,你可以使用 `MockedStatic` 类轻松地模拟静态方法。 以下是如何使用 `MockedStatic` 模拟静态方法的示例: 1. 首先,确保你已经添加了 Mockito 的依赖项。对于 Maven 项目,添加以下依赖项: ```xml <dependency> <groupId>org.mockito</groupId
2952 9
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
【4月更文挑战第9天】本文探讨了Python在自动化测试中的应用,强调其作为热门选择的原因。Python拥有丰富的测试框架(如unittest、pytest、nose)以支持自动化测试,简化测试用例的编写与维护。示例展示了使用unittest进行单元测试的基本步骤。此外,Python还适用于集成测试、系统测试等,提供模拟外部系统行为的工具。在脚本编写实践中,Python的灵活语法和强大库(如os、shutil、sqlite3、json)助力执行复杂测试任务。同时,Python支持并发、分布式执行及与Jenkins、Travis CI等持续集成工具的集成,提升测试效率和质量。
712 3
|
XML 存储 Web App开发
技术笔记:UserData使用总结
技术笔记:UserData使用总结
526 0
|
前端开发 Java API
深度|低代码开发平台和微服务架构的优势与挑战
低代码开发平台和微服务架构是当前软件开发领域的两个热门话题。它们都是为了更高效、更灵活地构建和开发应用程序而出现的解决方案。本文将以一款基于微服务架构的OneCode引擎为案例来探讨低代码开发平台和微服务架构的优势和挑战。