SpringBoot整合ShardingSphere5.x实现数据加解密功能

news/2024/10/27 23:20:59/

环境:Springboot2.6.14 + ShardingSphere5.3.0


准备环境

  • 添加依赖

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>${shardingsphere.version}</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus.version}</version>
</dependency>
  • 数据表users

  1. pwd:明文字段

  2. pwd_clipher:密文字段

  3. assisted_query_pwd:查询辅助列

  • 配置文件

application.yml配置文件(Springboot)

spring:datasource:driverClassName: org.apache.shardingsphere.driver.ShardingSphereDriver    url: jdbc:shardingsphere:classpath:config.yamlname: EncryptHikariCP
---
mybatis-plus:configuration:mapUnderscoreToCamelCase: truemapperLocations: classpath*:/mapper/**/*.xmltypeAliasesPackage: com.pack

config.yaml配置文件(ShardingSphere)

#数据源配置
dataSources:ds1:dataSourceClassName: com.zaxxer.hikari.HikariDataSourcedriverClassName: com.mysql.cj.jdbc.DriverjdbcUrl: jdbc:mysql://localhost:3306/testjpa?serverTimezone=GMT%2B8&useSSL=falseusername: rootpassword: 123123minimumIdle: 10maximumPoolSize: 200autoCommit: trueidleTimeout: 30000poolName: MasterHikariCPmaxLifetime: 1800000connectionTimeout: 30000connectionTestQuery: SELECT 1
#规则配置
rules:
- !ENCRYPT #加解密相关配置tables:users:columns:pwd:  #逻辑列(如果是老系统一般都会吧这个逻辑列和实际物理列名一致)plainColumn: pwd  #实际物理列名cipherColumn: pwd_cipher #加密后的列名encryptorName: pwd_encryptor  #加密列使用的加密算法(对应下面的配置)#assistedQueryColumn: assisted_query_pwd#assistedQueryEncryptorName: assisted_encryptorqueryWithCipherColumn: trueencryptors:pwd_encryptor:type: SM4props:sm4-key: aaaabbbbccccdddd1111222233334444sm4-mode: ECBsm4-iv: aabbccddeeffgghhsm4-padding: PKCS7Paddingassisted_encryptor:type: SM3props:sm3-salt: aaaabbbb
#执行时打印SQL
props:sql-show: true    

有了上面配置后,接下来就可以进行相应的CRUD操作了。

CRUD操作

实体对象


@TableName("users")
public class Users {@TableId(type = IdType.ASSIGN_ID)private Long id;private String name;@TableField("id_no")private String idNo ;private Integer age;private String email;private String pwd ;
}

Mapper类


public interface UsersMapper extends BaseMapper<Users> {}

测试类


@SpringBootTest
public class UserMapperTest {@Resourceprivate UsersMapper usersMapper ;@Resourceprivate IUsersService us ;@Resourceprivate List<DataSource> dataSources ;@Testpublic void testUserList() {QueryWrapper<Users> queryWrapper = new QueryWrapper<>() ;queryWrapper.eq("pwd", "999999") ;System.out.println(this.usersMapper.selectList(queryWrapper)) ;}@Testpublic void testSave() {Users user = new Users() ;user.setAge(99) ;user.setEmail("99999@qq.com") ;user.setIdNo("999999") ;user.setName("久久") ;user.setPwd("999999") ;this.usersMapper.insert(user) ;}}

测试结果

数据源及查询辅助列

  • 数据源配置

在config.yaml文件中我们配置了连接池信息,但是实际没有生效。如上配置的最小连接数是10,最大是200,但是实际打印都成了默认值都是10。最后修改连接池配置方式如下:

spring:datasource:driverClassName: org.apache.shardingsphere.driver.ShardingSphereDriver    url: jdbc:shardingsphere:classpath:config.yamlname: EncryptHikariCPhikari:minimumIdle: 10maximumPoolSize: 200autoCommit: trueidleTimeout: 30000poolName: BaseHikariCPmaxLifetime: 1800000connectionTimeout: 30000connectionTestQuery: SELECT 1

如上配置后连接池才正常。

  • 辅助查询列

辅助查询列会根据你的配置是否使用辅助列,当没有配置辅助查询列时,执行SQL如下:

使用的是加密列进行查询了

当配置了辅助查询列后:

使用的是辅助列查询。

完毕!!!

 图片

 


http://www.ppmy.cn/news/263892.html

相关文章

iOS View 生命周期

现在来看看View的生命周期 显示过程 -(void)willMoveToSuperview:(UIView *)newSuperview -(void)didMoveToSuperview -(void)willMoveToWindow:(UIWindow *)newWindow -(void)didMoveToWindow -(void)layoutSubviews 移除过程 -(void)willMoveToSuperview:(UIView *)ne…

老人跌倒检测识别预警算法 yolov7

老人跌倒检测识别预警系统采用yolov7网络模型技术&#xff0c;老人跌倒检测识别预警算法对老人的行为进行实时监测。当老人发生跌倒时&#xff0c;系统将自动发出警报&#xff0c;及时通知现场护理人员进行处理。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研…

Django - 页面静态化基本使用(一)

一. 前言 一个网页会有很多数据是不需要经常变动的&#xff0c;比如说首页&#xff0c;变动频率低而访问量大&#xff0c;我们可以把它静态化&#xff0c;这样就不需要每次有请求都要查询数据库再返回&#xff0c;可以减少服务器压力 我们可以使用Django的模板渲染功能完成页面…

Vue 2和Vue 3路由Router创建的区别简记(在main.js文件中引入的区别和router的js文件中创建语法的区别)

Vue 2和Vue 3路由Router创建的区别即Router3.0和Router4.0的创建区别简记 1、版本的搭配&#xff1a; Vue 2到Vue 3的改版升级&#xff0c;同样的带来Vue Router的升级。创建Vue项目之后&#xff0c;我们可以在package.json文件中看到&#xff0c;Vue 2创建的项目往往是与Vue…

Es elasticsearch 十八 Logstash 数据抽取工具

目录 基础 启动命令 简单配置文件 控制台输入输出打印 input从log文件获取数据-如分布式日志收集 监听端口 filter过滤器 Grok 正则捕获 Output 输出到es 文件输入 es输出 获取日志中字段 level 基础 从原数据 获取数据 发送到 某地方 Input{} filter{} output{} …

python爬虫之redis安装及使用示例

Redis是一个开源的、内存中的数据结构存储&#xff0c;用于缓存、消息队列和会话存储等。Redis的数据结构非常强大&#xff0c;例如支持Hash、String、Set和List等数据类型&#xff0c;而且能够使用Lua脚本进行批量操作&#xff0c;因此在Python爬虫工具中被广泛应用。在本文中…

23年测试岗,测试工程师从初级到中高级进阶,测试晋升之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 调查显示&#xf…

JMeter 常用的几种断言方法,你会几种呢?

在使用Jmeter进行性能测试或者接口自动化测试工作中&#xff0c;经常会用到的一个功能&#xff0c;就是断言。断言是在请求的返回层面增加一层判断机制。因为请求成功了&#xff0c;并不代表结果一定正确&#xff0c;因此需要判断机制提高测试准确性。本文 主要介绍3种常用的断…