AOP实现注解式脱敏数据明文查询
最近又遇到了脱敏数据查询相关的问题,常规的脱敏数据比如用户身份证将中间位数抹去后加入数据库,那么查询时需要手动调用就比较麻烦,不过可以使用自定义注解,利用AOP解析后在切面将数据加密再作为参数注入运行,实现非入侵的脱敏数据明文查询。简单记录一下。
情境和思路
用户身份证脱敏,保留前四位和后八位,其余转换为×符号存入数据库。利用aop在方法执行的切面将注解修饰的方法中对应的参数进行加密后注入,就能实现脱敏数据的明文搜索,而不用手动调工具类了。
实现
用户
简单的用户信息,code为身份证。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private int id;private String code;private String name;private byte sex;
}
Mapper
简单的搜索接口。
@Mapper
public interface UserMapper {@Select("select * from user where code = #{code}")public User findUserByCode(String code);
}
加密工具类
将加密类型也作为参数,适应不同情况。
public class EncryptionUtil {public final static String SELF_CODE = "self_code";// 加密public static String encrypt(String str, String type){if (SELF_CODE.equals(type)) {// 身份证前四位加上后六位return str.substring(0, 4) + "xxxxxxxx" + str.substring(str.length() - 6);}return null;}
}
加密注解
@Encrypt
注解,包含两个成员,indexes
数组存放需要加密的参数序号,types
存放加密类型。
// 自动加密注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Encrypt {// 记录需要加密的参数位置int[] indexes();// 记录加密对像的typeString[] types();
}
Aop切面处理类
关键逻辑类,使用around
方法和ProceedingJoinPoint
对象将获取对应切面方法的注解和参数信息,对参数进行加密处理后注入。
@Component
@Aspect
public class EncryptAspect {@Pointcut("execution(* com.huiluczP.controller.UserController.*(..)) && @annotation(com.huiluczP.annotation.Encrypt)")private void point() {}@Around("point()")// 环绕aop,获取切面方法对应的annotationprivate Object around(ProceedingJoinPoint pjp) throws Throwable {// 得到方法执行所需的参数Object[] args = pjp.getArgs();Encrypt encryptParam = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(Encrypt.class);// 获取需要加密的参数位置和加密类型int[] indexes = encryptParam.indexes();String[] types = encryptParam.types();// 对参数进行处理for(int i=0;i<indexes.length;i++){int index = indexes[i];args[index] = EncryptionUtil.encrypt((String)args[index], types[i]);}return pjp.proceed(args);}
}
这边利用execution(* com.huiluczP.controller.UserController.*(..)) && @annotation(com.huiluczP.annotation.Encrypt)
将UserController中持有@Encrypt
注解的所有方法都归入切面。
UserController
传入明文对象进行脱敏数据的查询。在注解中定义了加密参数位置和类型。
@Controller
@RequestMapping("/user")
public class UserController {@AutowiredUserMapper userMapper;@RequestMapping("/findByCode")@ResponseBody// 自动加密注解@Encrypt(indexes = {0}, types = {EncryptionUtil.SELF_CODE})public String findUser(String code){User user = userMapper.findUserByCode(code);return JSONObject.toJSONString(user);}
}
演示
成功进行了查询。
总结
简单的Aop应用,来解决脱敏数据明文查询的代码冗余问题,面向切面确实蛮方便的,就是切面定义表达式比较难写。感兴趣就看看吧。
AOP实现注解式脱敏数据明文查询相关推荐
- springboot mongodb 脱敏数据的明文查询
一.背景 1.1 项目运行环境 spring-boot 2.0.6 数据库:mongodb 4.4.4 orm框架:spring-data-mongodb java 10 1.2 关于四要素脱敏 所谓 ...
- 十、springboot注解式AOP(@Aspect)统一日志管理
springboot注解式AOP(@Aspect)统一日志管理 简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功 ...
- 大数据量查询:流式查询与游标查询
最近在做一个计算相关的功能,大体就是有很多条SQL,每条SQL都涉及复杂地运算,最后要将所有计算结果进行合并分析.经初步测试,每个SQL起码会查出几十万条记录,我们现在有毛毛多的这种SQL. 最大的问 ...
- 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发
1. 事务属性 1.1 事务传播属性 配套视频:[编程不良人]快速入门Spring,SpringBoot.SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili # ...
- Shiro授权--注解式开发
目录 一.授权角色,权限 UserMapper.xml 添加查询方法 UserMapper UserBiz UserBizImpl MyRealm 重新MyRealm 编写授权方法 配置文件 ap ...
- @select注解_Mybatis基本知识十七:Mybatis注解式开发-单表注解式开发
上一篇文章:<Mybatis基本知识十六:查询缓存之第三方查询缓存> 若文中有纰漏,请多多指正!!! 1.前言 使用Mybatis进行开发,不仅可以使用mapper配置文件进行开发,也可以 ...
- mqtt 发送消息过多_阿里云MQTT服务端注解式消息处理分发与同步调用实践小结
一.前言 前段时间公司预研了设备app端与服务端的交互方案,出于多方面考量最终选用了阿里云的微服务队列MQTT方案,基于此方案,本人主要实践有: 1. 封装了RocketMQ实现MQTT订阅与发布的实 ...
- redis返回的结果是null_Spring AOP 用注解封装 redis 缓存
前言 面试时问到用没用过 AOP,很多回答都是用 AOP 做过日志统一处理. 给人感觉就是没做过啊 今天介绍一个用注解封装 redis 缓存的 AOP 实战 redis 缓存加速的基本逻辑 用 red ...
- java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验
why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...
最新文章
- python中yield的认识与学习|生成器
- Android SDK国内更新
- HTTP协议详解 转自小坦克
- tomcat的端口修改
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇
- 多进程使用wikimedia数据训练word2vec模型
- OpenCV2.3.1 VS 安装
- oracle 一个实例创建多个数据库_Oracle闪回,为你的数据库上一个安全防线
- 避坑指南!数据分析最容易被忽略的10个错误
- Mongo 与 SQL 操作对应介绍
- 软件类配置(五)【强化学习算法框架-Ubuntu16.04安装谷歌Dopamine及初步测试】
- Window下本地redis的安装、配置以及java版试用
- 78. Subsets 1
- MySQL-第九篇分组和组函数
- UT斯达康首家手机网上专卖店落户淘宝网
- C++的虚函数表指针vptr
- HDU-5064-Find Sequence(DP)
- 【零基础学Python】Day9 Python推导式
- php自学难_php难吗?自学要多久?需要报培训班吗?
- 安装计算机的显卡出现问题,电脑显卡驱动安装失败如何解决
热门文章
- mail是什么意思?一次性邮箱注册哪家好你知道吗?
- 新闻 | 华院计算入选中国科技产业智库AIGC产业图谱
- python指定圆心画圆
- 带RC负载的单相全波桥式整流器研究(Matlab代码实现)
- Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换
- C语言基本数据类型笔记整理(整型、实型/浮点型、字符型、枚举型、构造类型、指针类型、空类型)
- 4S店说好的3个月或5000公里换机油都是骗人的?
- java 自动微分,MIT开源高性能自动微分框架Enzyme:速度提升4.5倍
- 【深度好文】使用opencv创建简单黑白粉笔画
- python 通过openpyxl来操作Excel文件(二 ):写入Excel文件