【RuoYi-Vue-Plus】学习笔记 48 - 数据加密功能 Encrypt 源码分析

news2024/11/22 21:07:18

文章目录

    • 前言
    • 参考目录
    • 功能实现的准备知识
      • 1、目录结构说明
      • 2、一些准备知识
      • 2.1、自定义插件如何实现?
      • 2.2、Mybatis 拦截器的拦截点?
      • 2.3、关于 `@Intercepts` 注解?
      • 2.4、关于拦截器中的 `Interceptor()` 方法和 `plugin()` 方法?
    • 功能调用流程分析
      • 1、说明
      • 1.1、数据加密配置
      • 1.2、加密实体类
      • 1.3、Mapper(非必须)
      • 1.4、测试方法
      • 2、加密过程的实现分析
      • 2.1、拦截加密实现方法
      • 2.2、自定义加密处理器
      • 2.2.1、获取类加密字段缓存
      • 2.2.2、属性值替换
      • 2.2.3、字段加密调用过程
      • 2.3、字段加密完成
      • 3、解密过程的实现分析
      • 3.1、拦截解密实现方法
      • 3.2、自定义解密处理器
      • 3.2.1、获取类加密字段缓存
      • 3.2.2、属性值替换
      • 3.2.3、字段解密调用过程
      • 3.3、字段解密完成

前言

前段时间,在群里大佬们讨论了关于数据存储加密的相关需求,后面就有了关于这个功能的 PR,在 框架 5.X 版本 中,这个功能被抽取成了独立的组件,所以本文来分析一下这个功能的实现。

值得一提的是,基于这个功能,并且借助最近大火的 ChatGPT,对于 Mybatis 的自定义插件的实现过程,我有了更进一步的了解,并且最近也在结合书籍进行 Mybatis 源码的阅读,受益匪浅,有空的话会单独再对书中的笔记进行整理分享。

参考目录

  • 数据加密
    主要是关于该功能的使用说明。
  • 通用源码阅读指导书:MyBatis源码详解
    对于 Mybatis 源码(基于 V3.5.2 版本,目前框架版本为 V3.5.11)学习的资料,写得很详细并且易于上手。

功能实现的准备知识

1、目录结构说明

在这里插入图片描述

说明功能
EncryptField字段加密注解标注需要加密的字段,用于实体类字段上
AlgorithmType算法枚举加密注解的加密算法 algorithm()
EncodeType编码类型枚举加密注解的编码类型 encode()
EncryptorAutoConfiguration加解密模块配置类配置初始化,注册加密解密拦截器以及加密管理类
EncryptorProperties加解密属性配置类Yaml 配置
EncryptorManager加密管理类加解密功能的缓存管理以及方法调用
EncryptContext加密上下文对象用于 encryptor 传递必要的参数
IEncryptor加解密接口提供加解密接口用于自定义扩展
*Encryptor加解密现类根据 AlgorithmType 以及 EncodeType 提供不同的加解密实现
MybatisEncryptInterceptor入参加密拦截器加密功能核心实现类
MybatisDecryptInterceptor出参解密拦截器解密功能核心实现类

2、一些准备知识

通过上面的目录结构,其实可以知道的是,要实现加解密功能,需要重点关注的是两个 Mybatis 拦截器。

关于这一部分,我看了源码以及书,也请教了一下 ChatGPT,下面是整理后的一些内容,了解了之后可以对这个功能先有一个大致的了解。

2.1、自定义插件如何实现?

Mybatis的自定义插件是通过实现Mybatis提供的拦截器接口实现的。

这里的拦截器接口就是指 org.apache.ibatis.plugin.Interceptor,框架中 MybatisEncryptInterceptor 以及 MybatisDecryptInterceptor 也分别实现了这个接口。

2.2、Mybatis 拦截器的拦截点?

在这里插入图片描述

加密操作:对 ParameterHandler 进行拦截处理,拦截参数设置。
在这里插入图片描述

解密操作:对 ResultSetHandler 进行拦截处理,拦截结果集处理过程。
在这里插入图片描述

2.3、关于 @Intercepts 注解?

在这里插入图片描述

2.4、关于拦截器中的 Interceptor() 方法和 plugin() 方法?

在这里插入图片描述
在这里插入图片描述

MybatisEncryptInterceptor#plugin
在这里插入图片描述

MybatisDecryptInterceptor#intercept
在这里插入图片描述
下面通过 Debug 结合框架中的代码来分析一下这个功能。

功能调用流程分析

1、说明

1.1、数据加密配置

application.yml
在这里插入图片描述
本文使用默认配置进行说明,其他配置可以参考框架 wiki。

1.2、加密实体类

com.ruoyi.demo.domain.TestDemoEncrypt
在这里插入图片描述

1.3、Mapper(非必须)

com.ruoyi.demo.mapper.TestDemoEncryptMapper
在这里插入图片描述

由于我使用的是开发中的分支,加入了多租户插件,这里为了避免报错所以使用了插件忽略注解。

1.4、测试方法

com.ruoyi.demo.controller.TestEncryptController
在这里插入图片描述

这是框架内置的测试方法,如果想要更好地了解执行过程,也可以对此方法拆分再进行 Debug 分析。如下:

在这里插入图片描述

加密解密操作可以理解成是一个相互的过程,有加密就有解密。理解了其中一个之后,另一个其实也是类似的过程。下面分别会对这两个过程进行分析。

2、加密过程的实现分析

2.1、拦截加密实现方法

MybatisEncryptInterceptor#plugin
在这里插入图片描述

2.2、自定义加密处理器

MybatisEncryptInterceptor#encryptHandler
在这里插入图片描述

2.2.1、获取类加密字段缓存

EncryptorManager#getFieldCache
在这里插入图片描述

由于第一次调用缓存中没有,所以对所有标注 @EncryptField 注解的字段设置属性获取权限,并返回结果集。

2.2.2、属性值替换

在这里插入图片描述

2.2.3、字段加密调用过程

MybatisEncryptInterceptor#encryptField
在这里插入图片描述

根据注解以及配置创建加解密上下文对象,调用加密方法。

EncryptorManager#encrypt在这里插入图片描述

根据加密算法创建对应的加密器,并且存入缓存。
EncryptorManager#registAndGetEncryptor
在这里插入图片描述

调用加密器的加密方法进行加密。
Base64Encryptor#encrypt
在这里插入图片描述

2.3、字段加密完成

加密完成后,返回步骤 #2.2 进行属性值替换。
在这里插入图片描述

循环替换完成后的结果:
在这里插入图片描述

所有字段加密完成后,回到拦截方法并返回目标对象。
在这里插入图片描述

3、解密过程的实现分析

3.1、拦截解密实现方法

MybatisDecryptInterceptor#intercept
在这里插入图片描述

3.2、自定义解密处理器

MybatisDecryptInterceptor#decryptHandler
在这里插入图片描述

在这里插入图片描述

3.2.1、获取类加密字段缓存

这一步和加密类似,由于加密过程中已经将字段存入缓存中,因此可以直接获取到。验证方法:
在这里插入图片描述

3.2.2、属性值替换

上一步获取到类加密字段缓存后,循环进行字段解密。
在这里插入图片描述

3.2.3、字段解密调用过程

MybatisDecryptInterceptor#decryptField
在这里插入图片描述

根据注解以及配置创建加解密上下文对象,调用解密方法。
在这里插入图片描述

如果是第一次调用,同样会根据加密算法创建对应的加密器,并且存入缓存。
在这里插入图片描述

调用加密器的解密方法进行解密。
Base64Encryptor#decrypt
在这里插入图片描述

3.3、字段解密完成

解密完成后,返回步骤 #3.2 进行属性值替换。
在这里插入图片描述

循环替换完成后的结果:
在这里插入图片描述

所有字段解密完成后,回到拦截方法并返回执行结果。
在这里插入图片描述

以上是加解密调用流程的分析。

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业数字化转型中信息化是什么

数字化转型带给企业的价值无疑是能够支撑起这股热潮的,这种流行趋势在数字化时代也并不意外。不过有一点值得注意,那就是数字化转型毕竟发展时间还不太长,虽然有未来加持,但又有多少企业能够在当下坚持数字化转型,顺利…

MYSQL的第四次索引视图

题目: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课…

[数据库迁移]-MySQL常见问题

[数据库迁移]-MySQL常见问题 森格 | 2023年2月 介绍:记录在MySQL数据库迁移过程中遇到的问题,以及解决方案。 文章目录[数据库迁移]-MySQL常见问题一、背景二、常见问题2.1 ERROR 20032.2 ERROR 12732.3 ERROR 10712.4 视图权限2.5 ERROR 1062三、总结一…

idea提交git时过滤掉不必要的文件 mes

.ignore插件的安装非常简单,如下图所示: 1.添加.gitignore 在项目上创建 在打开的面板中,执行如下图所示的选择: 3.在本地项目下文件上创建需要过滤文件后缀名 ### Example user template template ### Example user templa…

算法笔记(五)—— 二叉树

链表练习题: 1. 查两个链表的第一个入环结点,loop1,loop2。(快慢指针,相交后,快指针放头节点) 2. 当loop1null , loop2null时 如果两个链表最后一个结点不相等,那么一定不相交。 最后一个结点地…

Allegro如何设置最大撤回步数操作指导

Allegro如何设置最大撤回步数操作指导 在做PCB设计的时候,偶尔会出现误操作或者简单评估需要撤回到原来的状态,避免返工。Allegro支持撤回操作,用菜单的Undo命令即可实现 同样还支持设置最大的撤回步数,具体操作如下 点击Setup点击User Preferences

C语言(ctype.h系列的字符函数)

1.字符测试函数 函数名 如果时下列函数时,返回值为真 Isalnum() 字母或数字 isalpha() 字母 isblank() 标准的空白字符(空格,水平制表符或换行符)或任…

AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》

如果说2023年有什么新作,《魔咒之地(Forspoken)》当属开年大作之一,1月25日才在steam平台发售。虽然开售后的表现似乎不如想象中优秀,加之价格相对昂贵,令不少玩家望而却步,但如果只是想尝鲜&am…

面试攻略,Java 基础面试 100 问(二)

五大基本原则 单一职责原则SRP(Single Responsibility Principle) 是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。 开放封闭原则OCP(Open&#xff0…

ACM第一周---周训---题目合集.

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石.CSDN 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​ 📣系列专栏:ACM周训练题目合集.CSDN 💬总结&#xff1a…

QT入门Input Widgets之QFontComboBox、QTextEdit、QPlainTextEdit、QDial、QKeySequenceEdit

目录 一、QFontComboBox的相关介绍 1、实际使用 二、QTextEdit与QPlainTextEdit 三、QDial的相关介绍 四、QKeySequenceEdit的相关介绍 此文为作者原创,创作不易,转载请标明出处! 一、QFontComboBox的相关介绍 1、实际使用 一般使用较…

Java 中FastJson的使用【吃透FastJson】

如果不了解JSON格式,建议先看下:JSON数据格式【学习记录】 JSON序列化、反序列化JavaBean的框架有很多,最常见的Jackson、阿里巴巴开源的FastJson、谷歌的GSON、apache提供的json-lib等,下面我们主要来熟悉一下:Java语…

时隔多年,这次我终于把动态代理的源码翻了个地儿朝天

本文内容整理自 博学谷狂野架构师 动态代理简介 ​ Proxy模式是常用的设计模式,其特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 用户可以更加结构图&#xff0…

软件项目进度安排与跟踪:关键路径的计算

在一个软件项目中,管理人员需要按时了解项目进度,制定项目计划,同时需要及时发现所遇到的问题,然后和团队成员制定解决方案,确保整个计划可以顺利的进行,因此项目进度安排与跟踪是项目管理中的一个重要环节…

SpringBoot 整合 Nacos 实现注册中心和配置中心

SpringBoot 整合 Nacos 引入 Maven 依赖 首先&#xff0c;我们还是要引入 Maven 依赖&#x1f447; <!--注册中心的依赖--> <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactI…

雷达气象学和卫星气象学期末复习笔记

雷达气象学期末复习 气象雷达和雷达气象 气象雷达&#xff1a;用于气象探测的雷达&#xff0c;气象目标主要是云和降水粒子 雷达气象&#xff1a;利用气象雷达研究气象中的局地降水和局地降水系统&#xff0c;为降水系统的探测和临近预报服务 雷达的分类 天气雷达&#xff1a;…

CTF-取证题目解析-提供环境

一、安装 官网下载&#xff1a;Volatility 2.6 Release 1、将windows下载的volatility上传到 kali/home 文件夹里面 3、将home/kali/vol刚刚上传的 移动到use/sbin目录里面 mv volatility usr/local/sbin/ 切换到里面 cd /usr/local/sbin/volatility 输入配置环境echo $PAT…

SpringBoot依赖原理分析及配置文件

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot依赖原理分析及配置文件 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4…

电脑文件被误删?360文件恢复工具,免费的文件恢复软件

电脑里面保存着各种文件&#xff0c;因为误操作我们把还需要用的文件给删除了。很多人都想要使用不收费的文件恢复软件来进行恢复操作&#xff0c;但是又不清楚有哪些文件可以帮到我们。接下来就给大家介绍&#xff0c;一款真正免费的数据 恢复app&#xff0c;一起来看看&#…

eSGD(edge SGD) 边缘设备进行分布式机器学习的参数聚合策略实现高效通信 论文精读

说明 这篇论文比较短&#xff0c;但是提出的方法确很不错。联邦学习或者分布式机器学习中减少通信开销一般有两种方法&#xff1a; 减少发送的数据量&#xff1b;通过改变通信的拓扑结构&#xff1b; 本文通过选取重要的梯度进行更新而减少通信的开销&#xff0c;属于第一种…