• Spring 数据脱敏实现方式


    1、前言

         当前互联网中,越来越重视数据安全,数据脱敏在实际应用中越来越多。

    2 、脱敏方式

      2.1 数据库sql 语句脱敏

        sql 语句脱敏是比较传统通用的,例子如下所示:

    select CONCAT(LETF(mobile,3),"*****",RIGHT(mobile,3))  from tb_user

    2.2 通过Java 代码脱敏

        代码脱敏一般要通过aop以及自定义注解实现,代码如下。

    1. package com.example.demo.annotion;
    2. import java.lang.annotation.*;
    3. @Target(ElementType.METHOD)
    4. @Retention(RetentionPolicy.RUNTIME)
    5. @Documented
    6. public @interface DesensitizationWord {
    7. }
    1. package com.example.demo.annotion;
    2. import java.lang.annotation.*;
    3. @Target(ElementType.METHOD)
    4. @Retention(RetentionPolicy.RUNTIME)
    5. @Documented
    6. public @interface DesensitizationWord {
    7. }
    1. @Aspect
    2. @Component
    3. @Slf4j
    4. public class DesensitizationgWordAspect {
    5. @Pointcut(value = "@annotation(com.example.demo.annotion.DesensitizationWord)")
    6. public void desensitizationgWordFlag() {
    7. }
    8. @AfterReturning(value = "desensitizationgWordFlag()",returning = "result")
    9. public void afterReturning(JoinPoint joinPoint, Object result) throws IllegalAccessException {
    10. if(result instanceof Base){
    11. Base base = (Base)result;
    12. List<?> list = base.getData();
    13. if(CollectionUtils.isEmpty(list)) return;
    14. for(Object objcet:list){
    15. Field[] fields = objcet.getClass().getDeclaredFields();
    16. for(Field field:fields){
    17. Annotation[] annotations = field.getAnnotations();
    18. if(annotations!=null && annotations.length>0){
    19. for (Annotation annotation:annotations ){
    20. field.setAccessible(true);
    21. if(annotation instanceof Mobile){
    22. Object mobile = field.get(objcet);
    23. if(mobile instanceof String){
    24. String mobileString= (String)mobile;
    25. field.set(objcet,desensitizedPhoneNumber(mobileString));
    26. }
    27. }
    28. }
    29. }
    30. }
    31. }
    32. }
    33. }
    34. public String desensitizedPhoneNumber(String phoneNumber) {
    35. if (StringUtils.isNotBlank(phoneNumber)) {
    36. phoneNumber = phoneNumber.replaceAll("(\\w{3})\\w*(\\w{3})", "$1*****$2");
    37. }
    38. return phoneNumber;
    39. }
    40. }

    2.3 、通过mybatis-mate-sensitive-jackson 

        这个是mybaitsplus  的功能,其实实现的原理和2.2的的方法类型,只是它封装成jar包,并且支持扩展。 怎么使用大家可以参考企业高级特性 | MyBatis-Plus,它目前支持如下脱敏规则如

    1. package mybatis.mate.strategy;
    2. public interface SensitiveType {
    3. String chineseName = "chineseName";
    4. String idCard = "idCard";
    5. String phone = "phone";
    6. String mobile = "mobile";
    7. String address = "address";
    8. String email = "email";
    9. String bankCard = "bankCard";
    10. String password = "password";
    11. String carNumber = "carNumber";
    12. }

    在使用脱敏规则字段上新增注解 ,如下代码

    1. @FieldSensitive("chineseName ")
    2. private String username;

    还可以自定义脱敏规则,如下代码

    1. @Configuration
    2. public class SensitiveStrategyConfig {
    3. /**
    4. * 注入脱敏策略
    5. */
    6. @Bean
    7. public ISensitiveStrategy sensitiveStrategy() {
    8. // 自定义 testStrategy 类型脱敏处理
    9. return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
    10. }
    11. }

  • 相关阅读:
    【JavaScript高级程序设计】重点-第四章笔记:原始值与引用值、执行上下文与作用域、垃圾回收
    平衡二叉搜索树--AVL树
    常用 js 大全
    Spring Boot 项目中使用 JSP
    基于FPGA的SPI读写M25P16 Flash芯片
    MySQL和Oracle中,语法的不同点以及如何在xml中书写日期比较大小
    Go 1.21 新内置函数:min、max 和 clear
    Beacon帧
    监控Android Looper Message调度的另一种姿势
    PMP 11.27 考试倒计时6天!
  • 原文地址:https://blog.csdn.net/fangxiang2008/article/details/138082699