最近又遇到了脱敏数据查询相关的问题,常规的脱敏数据比如用户身份证将中间位数抹去后加入数据库,那么查询时需要手动调用就比较麻烦,不过可以使用自定义注解,利用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实现注解式脱敏数据明文查询相关推荐

  1. springboot mongodb 脱敏数据的明文查询

    一.背景 1.1 项目运行环境 spring-boot 2.0.6 数据库:mongodb 4.4.4 orm框架:spring-data-mongodb java 10 1.2 关于四要素脱敏 所谓 ...

  2. 十、springboot注解式AOP(@Aspect)统一日志管理

    springboot注解式AOP(@Aspect)统一日志管理 简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功 ...

  3. 大数据量查询:流式查询与游标查询

    最近在做一个计算相关的功能,大体就是有很多条SQL,每条SQL都涉及复杂地运算,最后要将所有计算结果进行合并分析.经初步测试,每个SQL起码会查出几十万条记录,我们现在有毛毛多的这种SQL. 最大的问 ...

  4. 【编程不良人】快速入门Spring学习笔记08---事务属性、Spring整合Structs2框架(SM)、Spring整合Mybatis+Struts2(SSM)、Spring注解、SSM注解式开发

    1. 事务属性 1.1 事务传播属性 配套视频:[编程不良人]快速入门Spring,SpringBoot.SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili # ...

  5. Shiro授权--注解式开发

    目录 一.授权角色,权限 UserMapper.xml 添加查询方法 UserMapper UserBiz UserBizImpl MyRealm  重新MyRealm 编写授权方法 配置文件  ap ...

  6. @select注解_Mybatis基本知识十七:Mybatis注解式开发-单表注解式开发

    上一篇文章:<Mybatis基本知识十六:查询缓存之第三方查询缓存> 若文中有纰漏,请多多指正!!! 1.前言 使用Mybatis进行开发,不仅可以使用mapper配置文件进行开发,也可以 ...

  7. mqtt 发送消息过多_阿里云MQTT服务端注解式消息处理分发与同步调用实践小结

    一.前言 前段时间公司预研了设备app端与服务端的交互方案,出于多方面考量最终选用了阿里云的微服务队列MQTT方案,基于此方案,本人主要实践有: 1. 封装了RocketMQ实现MQTT订阅与发布的实 ...

  8. redis返回的结果是null_Spring AOP 用注解封装 redis 缓存

    前言 面试时问到用没用过 AOP,很多回答都是用 AOP 做过日志统一处理. 给人感觉就是没做过啊 今天介绍一个用注解封装 redis 缓存的 AOP 实战 redis 缓存加速的基本逻辑 用 red ...

  9. java切面不需要接口了吗_详解Spring AOP 实现“切面式”valid校验

    why: 为什么要用aop实现校验? answer: spring mvc 默认自带的校验机制 @Valid + BindingResult, 但这种默认实现都得在Controller方法的中去接收B ...

最新文章

  1. python中yield的认识与学习|生成器
  2. Android SDK国内更新
  3. HTTP协议详解 转自小坦克
  4. tomcat的端口修改
  5. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇
  6. 多进程使用wikimedia数据训练word2vec模型
  7. OpenCV2.3.1 VS 安装
  8. oracle 一个实例创建多个数据库_Oracle闪回,为你的数据库上一个安全防线
  9. 避坑指南!数据分析最容易被忽略的10个错误
  10. Mongo 与 SQL 操作对应介绍
  11. 软件类配置(五)【强化学习算法框架-Ubuntu16.04安装谷歌Dopamine及初步测试】
  12. Window下本地redis的安装、配置以及java版试用
  13. 78. Subsets 1
  14. MySQL-第九篇分组和组函数
  15. UT斯达康首家手机网上专卖店落户淘宝网
  16. C++的虚函数表指针vptr
  17. HDU-5064-Find Sequence(DP)
  18. 【零基础学Python】Day9 Python推导式
  19. php自学难_php难吗?自学要多久?需要报培训班吗?
  20. 安装计算机的显卡出现问题,电脑显卡驱动安装失败如何解决

热门文章

  1. mail是什么意思?一次性邮箱注册哪家好你知道吗?
  2. 新闻 | 华院计算入选中国科技产业智库AIGC产业图谱
  3. python指定圆心画圆
  4. 带RC负载的单相全波桥式整流器研究(Matlab代码实现)
  5. Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换
  6. C语言基本数据类型笔记整理(整型、实型/浮点型、字符型、枚举型、构造类型、指针类型、空类型)
  7. 4S店说好的3个月或5000公里换机油都是骗人的?
  8. java 自动微分,MIT开源高性能自动微分框架Enzyme:速度提升4.5倍
  9. 【深度好文】使用opencv创建简单黑白粉笔画
  10. python 通过openpyxl来操作Excel文件(二 ):写入Excel文件