• druid 加密数据源:如何拦截 Druid 数据源自动注入完成帐密的解密?


    背景

    SpringBoot 项目,使用 Druid 自动装配的数据源,数据源的帐号密码配置加密后,如何完成数据源的装配呢?

    druid-spring-boot-starter 虽然自带了加密配置,但是密钥也是配置的,如果需要用自定义的加密解密工具,如果不用自带的工具,怎么自定义实现加密数据源的装配呢?

    本文从 DruidDataSourceAutoConfigure 类源码入手,仿造该类,自定义一个数据源注入配置,在真正注入 DruidDataSource 之前,对 druid 配置信息完成解密。

    主要思考三个问题:

    1. 自定的 Configuration 类中的 @Bean 注入一个 DruidDataSource ,为什么比自动装配的时机早呢?
    2. 如果自定义一个自动装配类, 包含DataSourceProperties 属性,对它的帐号密码解密后,让它在DruidDataSourceAutoConfigure 类之前装配,怎么实现呢?
    3. 自动装配类的工作原理是什么?注入优先级怎么确定的?

    加密数据源自主实现流程

    Not registered via @EnableConfigurationProperties, 
    marked as Spring component, 
    or scanned via @ConfigurationPropertiesScan 
    
    • 1
    • 2
    • 3

    @ConfigurationProperties 用法限制,我想到一个解决办法,为当前类加上 @Component,同时制定一个不可能的注入条件:@ConditionalOnProperty(prefix = "xx",name = "xxx", havingValue = "impossible")

    不用官方的加密插件,自定义 Druid 的解密配置,我想到的方法是完全仿照 Druid 数据源的自动装配过程,改写 DruidDataSource 的注入过程。

    关键是修改 DataSourceProperties 这个类的实例的帐号密码属性,其他完全照搬 DruidDataSourceAutoConfigure 实现即可。

    第一步,由于 Druid 自动注入的数据源 DruidDataSourceWrapper 是一个包内类,不能直接拿来用,所以完全拷贝一份这个类,定义为咱们自己的数据源类:

    @Component
    @ConfigurationProperties("spring.datasource.druid")
    @ConditionalOnProperty(prefix = "spring.datasource",name = "encrypted", havingValue = "impossible")
    public class MyEncryptedDatasourceWrapper extends DruidDataSource implements InitializingBean {
       
        @Autowired
        private DataSourceProperties basicProperties;
    
        public MyEncryptedDatasourceWrapper
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    Java | 学习笔记03 基础语法总结
    杂文:自家的智能家居方案研究
    现代企业架构框架——应用架构
    ASCII 码对照表详解
    基于深度学习的图像生成与识别技术研究
    【学习笔记】go协程和通道
    Django的设计模式及模板层
    MySQL单表过大、主从模式、同步模式优化原理
    淘宝API接入说明(商品详情数据示例)
    5 | Java Spark WordCount打成Jar 包测试
  • 原文地址:https://blog.csdn.net/wojiushiwo945you/article/details/127227625