最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

攔截Druid數(shù)據(jù)源自動注入帳密解密實現(xiàn)詳解

 更新時間:2022年11月03日 10:20:11   作者:畢小寶  
這篇文章主要為大家介紹了攔截Druid數(shù)據(jù)源自動注入帳密解密實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

SpringBoot 項目,使用 Druid 自動裝配的數(shù)據(jù)源,數(shù)據(jù)源的帳號密碼配置加密后,如何完成數(shù)據(jù)源的裝配呢?

druid-spring-boot-starter 雖然自帶了加密配置,但是密鑰也是配置的,如果需要用自定義的加密解密工具,如果不用自帶的工具,怎么自定義實現(xiàn)加密數(shù)據(jù)源的裝配呢?

本文從 DruidDataSourceAutoConfigure 類源碼入手,仿造該類,自定義一個數(shù)據(jù)源注入配置,在真正注入 DruidDataSource 之前,對 druid 配置信息完成解密。

主要思考三個問題:

  • 自定的 Configuration 類中的 @Bean 注入一個 DruidDataSource ,為什么比自動裝配的時機(jī)早呢?
  • 如果自定義一個自動裝配類, 包含DataSourceProperties 屬性,對它的帳號密碼解密后,讓它在DruidDataSourceAutoConfigure 類之前裝配,怎么實現(xiàn)呢?
  • 自動裝配類的工作原理是什么?注入優(yōu)先級怎么確定的?

加密數(shù)據(jù)源自主實現(xiàn)流程

Not registered via @EnableConfigurationProperties, 
marked as Spring component, 
or scanned via @ConfigurationPropertiesScan 

@ConfigurationProperties 用法限制,我想到一個解決辦法,為當(dāng)前類加上 @Component,同時制定一個不可能的注入條件:@ConditionalOnProperty(prefix = "xx",name = "xxx", havingValue = "impossible")。

不用官方的加密插件,自定義 Druid 的解密配置,我想到的方法是完全仿照 Druid 數(shù)據(jù)源的自動裝配過程,改寫 DruidDataSource 的注入過程。

關(guān)鍵是修改 DataSourceProperties 這個類的實例的帳號密碼屬性,其他完全照搬 DruidDataSourceAutoConfigure 實現(xiàn)即可。

第一步,由于 Druid 自動注入的數(shù)據(jù)源 DruidDataSourceWrapper 是一個包內(nèi)類,不能直接拿來用,所以完全拷貝一份這個類,定義為咱們自己的數(shù)據(jù)源類:

@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() {
    }
    @Override
    public void afterPropertiesSet() {
        if (super.getUsername() == null) {
            super.setUsername(this.basicProperties.determineUsername());
        }
        if (super.getPassword() == null) {
            super.setPassword(this.basicProperties.determinePassword());
        }
        if (super.getUrl() == null) {
            super.setUrl(this.basicProperties.determineUrl());
        }
        if (super.getDriverClassName() == null) {
            super.setDriverClassName(this.basicProperties.getDriverClassName());
        }
    }
    @Autowired(
            required = false
    )
    public void autoAddFilters(List<Filter> filters) {
        super.filters.addAll(filters);
    }
    @Override
    public void setMaxEvictableIdleTimeMillis(long maxEvictableIdleTimeMillis) {
        try {
            super.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
        } catch (IllegalArgumentException var4) {
            super.maxEvictableIdleTimeMillis = maxEvictableIdleTimeMillis;
        }
    }
}

第二步,自定義一個 DruidDataSourceAutoConfigure 類,內(nèi)容與該類一樣,但是多一個數(shù)據(jù)源配置屬性:

@Configuration
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class MyEncryptedDatasourceWrapperConfig {
    /**
     * 該屬性封裝了 spring.datasource 屬性,需要對它的帳號、密碼屬性進(jìn)行解密
     */
    @Autowired
    private DataSourceProperties basicProperties;
    /**
     * 使用數(shù)據(jù)源配置信息,解密帳號和密碼后創(chuàng)建數(shù)據(jù)庫連接池
     * @return
     */
    @Bean
    public DataSource dataSource() {
        // TODO 對密碼解密并設(shè)置回去
        basicProperties.setPassword(password);
        return new MyEncryptedDatasourceWrapper();
    }
}

這樣就完成了 Spring druid 數(shù)據(jù)源配置的解密處理了。

基礎(chǔ)鞏固

boolean proxyBeanMethods() 默認(rèn)值是 true. 從這個成員變量的注釋中,我們可以看到一句話 Specify whether {@code @Bean} methods should get proxied in order to enforce bean lifecycle behavior, e.g. to return shared singleton bean instances even in case of direct {@code @Bean} method calls in user code.

其實從這句話,我們就可以初步得到我們想要的答案了:在帶有 @Configuration 注解的類中,一個帶有 @Bean 注解的方法顯式調(diào)用另一個帶有 @Bean 注解的方法,返回的是共享的單例對象。

參考文檔:《Component 和 Configuration 區(qū)別》

額外嘗試

加密數(shù)據(jù)源配置的解密流程,核心在 DataSourceProperties 這個實例裝配完成后修改密碼信息,嘗試自定義一個 @Configuration@Bean 注入一個 DataSourceProperties 實例,但是這個對象到了 Druid 自動注入類那里,屬性還是沒有發(fā)生變化:

@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class MyAutoConfig {
    @Autowired
    private DataSourceProperties basicProperties;
    public MyAutoConfig() {
        System.out.println("My Auto config");
    }
    @Bean
    public DataSourceProperties basicProperties() {
        // TODO 解密配置
        System.out.println("username " + basicProperties.getUsername());
        return basicProperties;
    }
}

這里 @Bean 注入生效了,到了 DruidDataSource 那使用的也是這個實例,單步調(diào)試對象地址是一樣的,但是改的屬性沒有生效。

數(shù)據(jù)源實例化配置時引用的屬性:

但是兩個地方的屬性卻不同,前一步解密的信息并沒有傳遞到真正使用的地方。 理論上,同一個對象,前面修改了屬性,這里同一個線程里面,屬性應(yīng)該變化了才對呢!不得其解。

啟示錄

回顧開頭的三個問題:

  • 自定的 Configuration 類中的 @Bean 注入一個 DruidDataSource ,為什么比自動裝配的時機(jī)早呢?因為 @Bean 屬于當(dāng)前項目掃描路徑,它里面的類注入優(yōu)先級高于第三方 jar 包中的 spring.factories 的裝配類。
  • 如果自定義一個自動裝配類, 包含DataSourceProperties 屬性,對它的帳號密碼解密后,讓它在DruidDataSourceAutoConfigure 類之前裝配,怎么實現(xiàn)呢?嘗試定義一個裝配類 @Bean 裝配一個數(shù)據(jù)源 DataSourceProperties 對象,并修改配置。
  • 自動裝配類的工作原理是什么?注入優(yōu)先級怎么確定的?spring.factories 的本質(zhì)是 SPI,它針對的是第三方 jar 包,不需要手動配置掃描路徑,又需要自動注入的情況,是各種 starter 定義底層實現(xiàn)途徑。

優(yōu)先級:本地掃描路徑的 Configuration -> 實現(xiàn)了 BeanDefinitionRegistryPostProcessor 接口的類 -> spring.factories 中的自動裝配類。

以上就是攔截Druid數(shù)據(jù)源自動注入帳密解密實現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Druid注入帳密解密攔截的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 手工搭建Servlet實現(xiàn)

    手工搭建Servlet實現(xiàn)

    現(xiàn)在作為一個Java程序員,我們已經(jīng)習(xí)慣了使用IDE和Web框架進(jìn)行開發(fā),IDE幫助我們做了編譯、打包的工作。Spring框架則幫助我們實現(xiàn)了Servlet接口,并把Servlet容器注冊到了Web容器中。本文主要介紹了Servlet手工搭建,感興趣的可以了解一下
    2021-07-07
  • Java并發(fā)的CAS原理與ABA問題的講解

    Java并發(fā)的CAS原理與ABA問題的講解

    今天小編就為大家分享一篇關(guān)于Java并發(fā)的CAS原理與ABA問題的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • java實現(xiàn)即賦值也判斷的寫法示例

    java實現(xiàn)即賦值也判斷的寫法示例

    這篇文章主要為大家介紹了java實現(xiàn)即賦值也判斷的寫法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • JAVA函數(shù)的定義、使用方法實例分析

    JAVA函數(shù)的定義、使用方法實例分析

    這篇文章主要介紹了JAVA函數(shù)的定義、使用方法,結(jié)合實例形式分析了JAVA函數(shù)的基本概念、功能、原理、定義、使用方法與操作注意事項,需要的朋友可以參考下
    2020-04-04
  • Java 詳解如何獲取網(wǎng)絡(luò)接口信息

    Java 詳解如何獲取網(wǎng)絡(luò)接口信息

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實踐中才能獲得能力的提升,本篇文章手把手帶你用Java獲取網(wǎng)絡(luò)接口的信息,大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java實現(xiàn)微信掃碼登入的實例代碼

    Java實現(xiàn)微信掃碼登入的實例代碼

    這篇文章主要介紹了java實現(xiàn)微信掃碼登入功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Spring RedisTemplate優(yōu)化連接Redis數(shù)據(jù)庫詳解

    Spring RedisTemplate優(yōu)化連接Redis數(shù)據(jù)庫詳解

    這篇文章主要介紹了Spring RedisTemplate優(yōu)化連接Redis數(shù)據(jù)庫,RedisTemplate是Spring Data Redis中的核心組件之一,它提供了對Redis數(shù)據(jù)庫的訪問功能,對于高性能的Redis操作,合理的優(yōu)化RedisTemplate的使用非常重要
    2025-02-02
  • Java實現(xiàn)前端jsencrypt.js加密后端解密的示例代碼

    Java實現(xiàn)前端jsencrypt.js加密后端解密的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用jsencrypt.js實現(xiàn)前端加密,利用Java實現(xiàn)后端解密的功能,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-09-09
  • 換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中

    換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中

    這篇文章主要介紹了換了最新的idea如何將原來舊版本的idea設(shè)置導(dǎo)進(jìn)新的idea中,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java詳細(xì)分析梳理垃圾回收機(jī)制

    Java詳細(xì)分析梳理垃圾回收機(jī)制

    垃圾回收,顧名思義,便是將已經(jīng)分配出去的,但卻不再使用的內(nèi)存回收回來,以便能夠再次分配。在?Java?虛擬機(jī)的語境下,垃圾指的是死亡的對象所占據(jù)的堆空間
    2022-04-04

最新評論

东平县| 南昌市| 哈密市| 增城市| 葫芦岛市| 湘乡市| 民丰县| 磴口县| 新绛县| 潜江市| 乌恰县| 江都市| 鄂托克前旗| 祁门县| 长海县| 盐亭县| 察哈| 高邑县| 肇州县| 霍山县| 凤庆县| 县级市| 马尔康县| 榆树市| 柏乡县| 江山市| 纳雍县| 库尔勒市| 伊春市| 宣城市| 崇义县| 鄂伦春自治旗| 南通市| 安溪县| 临清市| 砀山县| 阿鲁科尔沁旗| 潜山县| 六枝特区| 南汇区| 芜湖县|