mybatis拦截器数据库加密敏感字段及审计功能,数据脱敏,逻辑删除等---通用mapper

desensitization实现数据脱敏 在实际开发过程中,我们时常出于隐私的要求,不再返回完整的用户姓名,电话等隐私信息,这时就需要用到数据脱敏技术,而现在已经有很成熟的脱敏技术依赖,不再需要自己开发脱敏实现了。下面就介绍脱敏技术中比较成熟的desensitization技术。邮箱手机号码中文名称身份证号码银行卡号码密码统一社会信用代码任意CharSequence类型的值级联脱敏。 阅读详情

 

一、数据加密

  1. 涉及注解

    1. EncryptFiled 加密注解

    2. DecryptFiled 解密注解

  2. mapper需要继承 CrudMapper(com.gitee.cashzhang27.test.boot.crypt.mapper.util.CrudMapper)

  3. 仅拦截通用mapper指定方法包括:("insert", "insertSelective","delete", "deleteByPrimaryKey","updateByPrimaryKey", "updateByPrimaryKeySelective","select", "selectOne", "selectByPrimaryKey", "selectByIds", "selectAll")

  4. 使用方式

在实体类字段上加上述两个注解,注意:要有 get set 方法

二、审计功能

  1. 涉及注解

    1. CreateTime

    2. CreateUser

    3. ModifiedTime

    4. ModifiedUser

三、逻辑删除

  1. 涉及注解

    1. LogicDelete

  1. 见上述 2345

四、数据脱敏

  1. 涉及注解

    1. Desensitize

    2. DesensitizeFiled

  2. 使用方式

    在需要脱敏字段加 DesensitizeFiled 注解

    参数枚举

    1. 默认或不填 转为 6个*

    2. FULL_NAME 姓名 保留最后一位

    3. ID_CARD 身份证号 保留前4位和后4位

    4. BANK_CARD 银行卡号 保留前4位和后4位

    5. MOBILE_PHONE 手机号 保留前3位后4位

在Controller方法上加 Desensitize 注解

   @Desensitize(clazz = User.class)
   @GetMapping("/selectByPrimaryKey/{id}")
   public User selectByPrimaryKey(@PathVariable("id") String id) {
     return userMapper.selectByPrimaryKey(id);
   }
 ​
   @Desensitize(clazz = User.class)
   @GetMapping("/selectWrapEntityByPrimaryKey/{id}")
   public ObjectRestResponse selectWrapEntityByPrimaryKey(@PathVariable("id") String id) {
     return ObjectRestResponse.ok(userMapper.selectByPrimaryKey(id));
   }

五、租户与部门隔离

  1. 参数为实体类class 例如

  2. 涉及注解

    1. Tenant

    2. Depart

  3. 使用方式 同上

六、实体类Demo


 import static com.gitee.cashzhang27.test.boot.crypt.mapper.entity.enums.DesensitizeType.BANK_CARD;
 import static com.gitee.cashzhang27.test.boot.crypt.mapper.entity.enums.DesensitizeType.FULL_NAME;
 import static com.gitee.cashzhang27.test.boot.crypt.mapper.entity.enums.DesensitizeType.ID_CARD;
 import static com.gitee.cashzhang27.test.boot.crypt.mapper.entity.enums.DesensitizeType.MOBILE_PHONE;
 ​
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.CreateTime;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.CreateUser;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.DecryptFiled;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.Depart;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.DesensitizeFiled;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.EncryptFiled;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.LogicDelete;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.ModifiedTime;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.ModifiedUser;
 import com.gitee.cashzhang27.test.boot.crypt.mapper.annotation.Tenant;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import javax.persistence.Column;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Table;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 ​
 /**
  * @author Cash Zhang
  * @version v1.0
  * @since 2019/07/09 15:17
  */
 @Data
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
 @Table(name = "tb_user")
 public class User implements Serializable {
 ​
   private static final long serialVersionUID = -7491215402569546437L;
 ​
   /**
    * 用户ID
    */
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select replace(uuid(), '-', '')")
   private String id;
 ​
   /**
    * 昵称
    */
   private String nickName;
   /**
    * 性别
    */
   private String gender;
   /**
    * 姓名
    */
   @DesensitizeFiled(type = FULL_NAME)
   private String fullName;
   /**
    * 身份证号
    */
   @EncryptFiled
   @DecryptFiled
   @DesensitizeFiled(type = ID_CARD)
   private String idCard;
   /**
    * 银行卡号
    */
   @EncryptFiled
   @DecryptFiled
   @DesensitizeFiled(type = BANK_CARD)
   private String bankCard;
   /**
    * 手机号
    */
   @EncryptFiled
   @DecryptFiled
   @DesensitizeFiled(type = MOBILE_PHONE)
   private String mobilePhone;
   /**
    * 部门ID
    */
   @Depart
   private String departId;
   /**
    * 租户ID
    */
   @Tenant
   private String tenantId;
   /**
    * 是否删除
    */
   @LogicDelete
   @Column(name = "is_deleted")
   private Integer deleted;
   /**
    * 创建人
    */
   @CreateUser
   private String userCreate;
   /**
    * 创建时间
    */
   @CreateTime
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
   @JsonDeserialize(using = LocalDateTimeDeserializer.class)
   @JsonSerialize(using = LocalDateTimeSerializer.class)
   private LocalDateTime gmtCreate;
   /**
    * 修改人
    */
   @ModifiedUser
   private String userModified;
   /**
    * 修改时间
    */
   @ModifiedTime
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
   @JsonDeserialize(using = LocalDateTimeDeserializer.class)
   @JsonSerialize(using = LocalDateTimeSerializer.class)
   private LocalDateTime gmtModified;
 ​
 }
 ​

七、测试用例及源码

https://gitee.com/cashzhang27/test-java/tree/master/test-boot/test-boot-crypt

Spring Boot员工信息管理系统安全架构:权限控制与数据脱敏实战 在软件开发领域,数据安全是构建企业级应用的核心基石,其核心原理在于通过分层防御机制保护敏感信息。从技术价值看,一个健壮的安全架构不仅能防止外部攻击,更能有效管控内部数据泄露风险,这对于任何处理用户或员工数据的系统都至关重要。在实际应用场景中,员工信息管理系统是典型的高价值目标,它要求开发者实现精细化的访问控制。本文聚焦于使用Spring Boot和MyBatis-Plus框架,深入探讨如何通过**权限控制**和**数据脱敏**两大关键技术,构建从URL、数据行到字段级别的立体防护体系,为OA、HR等系统提供 阅读详情

相关推荐

MyBatis-Plus字段加解密实战:保障MySQL敏感数据安全

数据安全是应用开发的核心议题,尤其在处理用户手机号、身份证等敏感信息时,防止数据泄露至关重要。在应用层对敏感字段进行加密存储是一种常见的安全实践,其原理是在数据写入数据库前进行加密,读取时再解密,从而确保即使数据库被非法访问,敏感信息也不易被直接获取。这项技术的核心价值在于将安全策略与业务逻辑解耦,提升代码的可维护性和安全性。在实际的工程实践中,ORM框架如MyBatis-Plus通过其拦截器或TypeHandler机制,能够以声明式、无侵入的方式自动完成字段的加解密,极大地简化了开发流程。然而,实现过程中

weixin_34161083的博客 489

mybatis拦截mapper,增强数据到数据库的读写

mybatis interceptor 拦截 mapper接口层的方法,增强入参和查询返回值

pspr2的博客 3245

MyBatis数据审计——跟踪数据的变动记录

数据审计(Data Audit)是指对信息系统中各种数据的完整性、真实性和准确性进行定期检查、评估、分析并向授权用户反馈,以发现、预防或解决信息系统中的数据问题。通过对数据的存储和流转过程进行审计,可以帮助企业更好地保障数据安全,提高数据质量和效益。在大型互联网公司,对数据库的数据访问及处理过程进行全面监控、控制和记录,不仅能够提供数据安全保障,还能够辅助管理人员追踪数据变化、分析数据趋势,改善业务流程和产品质量。

AI天才研究院 2865

基于Mybatis拦截器实现通用Mapper

基于Mybatis拦截器实现通用Mapper定义通用mapper定义拦截器调用 在实际开发中,我们可能会有这样的需求,将业务SQL配置到数据库中,这样在生产环境下,如果我们业务SQL发生改变(查询字段不变),只需要将sql缓存刷新即可,无需修改mapper文件,重启服务器。 下面介绍我自己根据mybatis拦截器实现的方式: 定义通用mapper <?xml version="1.0" en...

weixin_42743317的博客 2710

Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

Springboot 封装整活 Mybatis 动态查询条件SQL自动组装拼接

默默不代表沉默 6976

数字刊物系统架构设计说明书

本文档用于说明数字刊物系统的整体架构、技术选型、模块划分、分层职责、运行机制、数据架构、安全架构、部署架构和关键质量设计,为系统交付、后续维护、二次开发、测试设计、部署实施和技术评审提供依据。 本文档回答以下问题: 系统由哪些端、哪些服务和哪些基础设施组成。 管理端、移动端、后端服务、数据库、Redis、文件系统之间如何协作。 后端多模块 Maven 工程如何分层,模块之间依赖关系如何设计。 认证、授权、会话、接口加密、文件访问、统计采集等关键能力如何落地。 核心业务数据如何组织,缓存和异步任务如何支撑

qq_38127559的博客 179

【万字长文】AES 从基础原理到企业落地:认证加密、密钥管理与数据库字段加密实战

本文深入探讨AES加密在企业系统中的实际应用与常见误区,详细解析了AES-GCM工作模式、Nonce管理、认证标签等关键技术要点,并指出企业实践中常见的12类错误,通过Java实现示例展示了安全基线方案,涵盖密钥版本管理、AAD业务绑定等核心设计。同时指出加密需与KMS、访问控制等组成完整体系,并提供从数据库字段加密到合规要求的全链路实施方案检查清单,最终强调企业级安全需要算法、协议、密钥管理和工程实践的多维度协同。

m0_73429744的博客 405

告别“单打独斗”:Oh My Open Code 如何用多模型协作重塑 AI 编程范式

介绍"Oh My OpenCode"——一个能协调多个专业AI模型完成复杂开发任务的智能编程框架。您将看到它如何分配任务、发挥不同模型的独特优势,并通过并行处理和实时纠错等功能解决AI编程流程中的常见痛点。

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4208

基于SpringBoot的高校校园网故障管理系统设计与实现全指南

在高校信息化建设不断深入的背景下,校园网故障报修仍普遍依赖电话、群消息和纸质登记,信息分散且进度不透明,这正是Web管理系统典型的应用场景。SpringBoot作为当前Java后端开发的主流框架,以自动配置、快速启动和生态成熟等优势,成为毕业设计及工程实践中的热门选择。围绕故障工单的提交、派单、处理与统计闭环,系统需要覆盖用户权限、状态机流转、数据建模、接口设计等关键技术点。数据库设计中的表结构拆分、索引优化与操作日志留痕,以及Service层对状态变更的合法性校验,都是保障系统规范运行的核心环节。此类系统

weixin_34337381的博客 308

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9228

贝加莱Automation Studio 4.10安装保姆级教程:从官网下载到解决.Net 3.5报错

本文提供贝加莱Automation Studio 4.10的详细安装教程,涵盖从官网下载到解决.Net 3.5报错的全过程。特别针对工业自动化开发环境中常见的.Net Framework 3.5安装问题,提供多种经过验证的解决方案,包括控制面板安装、DISM命令离线安装和手动下载安装包等方法,帮助工程师顺利完成PLC开发环境的搭建。

weixin_30955617的博客 709

SpringBoot2整合Mybatis拦截器,拦截mapper接口的某个方法

需求: 在执行某个动态sql时,where 子句,希望通过用户进行自定义查询条件,比如用户可以传入 “id >100011 and name = '张三'” 的多条件表达式进行查询 (注意:这里的条件查询,为了安全性的考虑,是经过处理的,以免出现安全漏洞。) 方法: 1. 自定义mybatis的拦截器MySqlInterceptor(继承 org.apache.ibatis.plugin.Interceptor)对执行的mapper接口进行拦截 2. 改写对应...

周君的个人博客 1万+

Python学习(一)

快速入门 1.Linux系统中是可以直接使用Python进行编程,具体如下: 进入Python:在linux的Terminal中输入 Python ,进入Python的命令行; 退出Python:在linux的Terminal中输入quit() 或 exit() 或 ctrl +d ,再回车,退出Python的命令行。 2.python的源程序就是一个特殊格式的文本文件,可以使用任意文本编辑软件做Python的开发。 3.Python程序的文件扩展名通常都是 .py。 4.执行Python程序的方式:在

SummerXRT的博客 1279

SpringMVC:拦截Mybatis的mapper

SpringMVC:拦截Mybatis的mapper,处理代码冗余,加强代码维护性

一些平时在开发过程中遇到的常见问题,分享给大家 1267

仿真学习系列(四十九):Sigrity仿真之电容库制作

在高速电路设计中,电源完整性(PI)是确保系统稳定、可靠运行的关键因素。随着电子产品对性能的要求不断提升,PDN(电源分配网络)的设计与优化变得尤为重要。为了确保电源网络在高速工作状态下不会引发电压波动和信号干扰,我们需要在设计中精确地选择电容器进行优化,而电容库的制作则是这一过程的核心。 OptimizePI作为一个强大的电源完整性优化工具,能够帮助设计师根据不同的目标,批量进行PDN仿真,以得出最佳电容选择。

案例文章,高速信号 223

YOLO车辆测距、车辆识别与单目测距

YOLO(You Only Look Once)是一种实时物体检测系统,能够识别视频或图像中的多个对象,并确定其位置。结合车辆识别与单目测距技术,YOLO可以用于交通监控、自动驾驶等应用场景,通过单个摄像头实现车辆的识别与距离测量。YOLO结合单目测距技术,在多个应用领域展现出巨大的潜力与灵活性。其实时性和准确性为智能交通、自动驾驶等领域提供了强有力的技术支持。

走向CTO的路上... 1669

Mybatis拦截器

一 Mybatis拦截器介绍 Mybatis拦截器设计的初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。通过Mybatis拦截器我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。所以Mybatis拦截器的使用范围是非常广泛的。 Mybatis里面的核心对象还是比较多,如下: Mybatis核心对象 解释 SqlSession 作为MyBatis工作的主要顶层API,表示和数据库

sebeefe的博客 1913

C++实现设计ATM机系统

这个示例实现了一个基本的ATM机系统,支持注册、登录、存款、取款、查询余额和保存数据等功能。当然,这只是一个简单的ATM机模拟,实际的ATM机系统需要更复杂的逻辑和更严格的安全措施。C++编写一个简单的ATM机系统,我将提供一个基本的实现示例,但由于ATM机系统的复杂性和安全性要求,这只是一个简单的模拟,不适合在实际环境中使用。试设计一简单模拟ATM机系统,系统以菜单方式工作,采用自定义函数设计各功能模块被主菜单调用,使之能提供以下基本选项。=========欢迎使用ATM=========

走向CTO的路上... 1241

通用Mapper插件和MyBatis拦截器的使用

通用Mapper和MyBatis拦截器的使用MyBatis拦截器拦截器的作用MyBatis 拦截器的简单实现实例结果验证orderBy默认排序通用Mapper的使用 MyBatis拦截器 拦截器的作用 在实际开发过程中我们对于数据库中的表经常会有大量重复工作,例如在业务表中都会存在以下字段: // 创建时间 private LocalDateTime createTime; // 创建人 private String createBy; // 更新时间 private Local

liao411280543的博客 2124

AutoSAR配置与实践(深入篇)5.4 OS原理(下 )- 内存保护(MPU)

ECU可能由内部模块、第三方模块等各模块集成的。需求对每个模块所定义的安全等级可能有差异,需要考虑不同安全等级的模块和代码间减少相互干扰,防止程序错误传播。可以理解为包含Task、Alarm、Counter、Schedule table、ISRs、Event等基本对象的容器,用于隔离Task/Alarm等,进行内存保护。

nihaoljq2010的博客 3534

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Mybatis(拦截器实现)通用mapper及全ORM实现(一)

网上关于mybatis的拦截器文章有不少,但都大同小异,如果想做一个通用mapper和关系映射的查询都不太能够解决问题,所以自己就花了些时间写了一个mybatis的扩展(目前只实现了mysql数据库),具体项目可以在github上下载。 先简单介绍一下扩展使用,后面在陆续展开说明实现 实体类定义 假定数据三张表:公司、部门、员工,定义如下:   public abstract clas...

erct的专栏 1431

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Mybatis(拦截器实现)通用mapper及全ORM实现(三)

因为需要知道数据库表、字段和实体类的对应关系,那么下面就介绍下在mybatisext中如何实现的 注解定义 表注解@Table   package cw.frame.mybatisext.annotation; import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUN...

erct的专栏 962

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Mybatis(拦截器实现)通用mapper及全ORM实现(五)-- springboot+mybatis多数据源设置

本篇实际上和mybatisext项目并没有太大关系了,但在实际项目中脱离不开多个数据源,尤其是主从分离,同样网上一些资料大同小异而且大部分并不能真正解决问题,所以单独提出来说一下 假设我们就是要解决一个主从分离,数据源定义在了application.properties中如下: datasources.master.driverClassName=com.mysql.cj.jdbc.Driv...

erct的专栏 1007

Mybatis基于自定义拦截器+实体类注解实现数据加/解密(附源码)

最近接到一个需求,需要针对某些敏感数据入库时加密,出库时解密,避免出现被拖库后敏感信息暴露。根据面向搜索引擎编程原理,在经过一天一夜的深入调研 后,初步确立方案: 4. 其余细节有时间了再补充。。。可以先跑下demo 5. demo源码 https://gitee.com/Wananme/mybatis-interceptor-demo...

qq_30255701的博客 2248

分享如何使用通用Mapper

集成方法请看上面的文档,集成后,可以继续阅读本页文档。 1.1.1. 继承通用的Mapper,必须指定泛型 例如下面的例子: public interface UserInfoMapper extends MapperUserInfo> {   //其他必须手写的接口...   } 一旦继承了Mapper,继承的Mapper就拥有了以下通用的方法: //根据实体类不为n

Eyot_G的博客 1133

字段变更操作审计

业务数据变更,自动记录,操作日志审计

javaDB_EAD的专栏 1660
上一篇: Docker 端口映射外部无法访问问题
下一篇: Vue 数组操作
cashZhang27
博客等级 码龄10年 22粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值