springboot整合Druid加密 及連接錯誤處理


  • 首先我們使用Druid包的自帶密碼加密工具對我們的密碼進行加密

    如下所示,我們可以得到私鑰、公鑰和密碼密文:

    C:\Users\Administrator>cd /d C:\Users\Administrator\.m2\repository\com\alibaba\druid\1.1.6

     

    C:\Users\Administrator\.m2\repository\com\alibaba\druid\1.1.6>java  -cp druid-1.1.6.jar com.alibaba.druid.filter.config.ConfigTools password

    privateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAlwfk3zil6HQGe8QFz9UbttPds8k/JgEm6/feCl4cCmFW1DP7PKD2/TLFZCoeFFRhC1hqOEBhpadrR013huuFTQIDAQABAkAr4Cg2TP+twx8rD2xcz11IxM3wb/N/d/A1twFzY5mjzeXihuoZrefje1WN2q36YhAiEA5GgcdSV0qwYxAkUS24tgFp1EPlTmNKAa2YRWYUNUJkCIQCpRsuO9PrEVf8morsx5VousmyapnoOtW5Y7663zp7m1QIgb8sZaqkbkn3kTPUcBsMQE+GDvnJ1fnqCyrneQg+idbkCIGmzXkqPKMNOm7upY9C9UXnVSkGrcI4ctqHsUKJP8CNdAiEAnr2gYIT1EO3dPVpTyguKCxpawMnhQ/biwDUyzYb5mAw=

    publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJcH5N84peh0BnvEBc/VG7bT3bPJPyYBJuv33gpeHAphVtQz+zyg9v0yxWQqHhRUYQtYajhAYaWna0dNd4brhU0CAwEAAQ==

    password:gXhFklHpK8L6Z39gjA0lFccC7zHREii6FLXtW43h8yqH+47Hbat6URMhX6R3X4qMunhpxfWlisoZXqnFLlbEcw==

    Spring boot+Druid使用密碼加密后不起作用案例
  • 2

    在Spring boot的配置文件中配置密碼和config filter.

     

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/videoDB

    spring.datasource.username=root

    spring.datasource.password=password

    spring.datasource.filters=stat,log4j,wall,config

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

     

    spring.datasource.maxActive=20

    spring.datasource.max-idle=10

    spring.datasource.max-wait=10000

    spring.datasource.min-idle=5

    spring.datasource.initial-size=5

    Spring boot+Druid使用密碼加密后不起作用案例
  • 3

    配置數據源的用戶密碼以及解密的配置選項,password和connectionProperties屬性:

    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/videoDB

    spring.datasource.username=root

    spring.datasource.password=gXhFklHpK8L6Z39gjA0lFccC7zHREii6FLXtW43h8yqH+47Hbat6URMhX6R3X4qMunhpxfWlisoZXqnFLlbEcw==

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    spring.datasource.filters=stat,log4j,wall,config

    spring.datasource.connectionProperties=config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJcH5N84peh0BnvEBc/VG7bT3bPJPyYBJuv33gpeHAphVtQz+zyg9v0yxWQqHhRUYQtYajhAYaWna0dNd4brhU0CAwEAAQ==

    Spring boot+Druid使用密碼加密后不起作用案例
  • 4

    啟動Spring boot應用進行測試

    1)啟動Application

    2)測試有數據庫連接服務的操作,如視頻文件的上傳

    這時候可以測試可以知道數據庫信息入庫失敗,日志提示數據庫連接失敗:

    2018-01-17 15:10:20.481 ERROR 1144 --- [Create-15674126] com.alibaba.druid.pool.DruidDataSource   : create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/videoDB, errorCode 1045, state 28000

     

    java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

    3)說明我們配置的解密過濾器沒有生效,這也說明了根據Spring Boot+Druid是存在兼容性問題的,因為官方的樣例是使用Spring+Druid的模式

    Spring boot+Druid使用密碼加密后不起作用案例
  • 5

    最后得到的結論是:Druid與Spring Boot的兼容性問題還是比較多的,不建議使用該組合。

    從項目提交的問題來看,也體現出與Spring Boot的兼容性問題,具體問題如下圖所示。

    Spring boot+Druid使用密碼加密后不起作用案例
  • 6

    最后這里提供過一種方法解決該問題,就是自定義DataSource配置文件解析類,初始化Druid的數據源,讓其支持加密后的密文:

    1)創建一個配置文件讀初始化類 DataSourceConfig

    該類主要完成DataSource個參數值得獲取和解析,采用注解Configuration方式,主要的代碼如下:

    package image.dao;

     

    import java.sql.SQLException;

     

    import javax.sql.DataSource;

     

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import org.springframework.boot.context.properties.ConfigurationProperties;

    import org.springframework.context.annotation.Bean;

    import org.springframework.context.annotation.Configuration;

    import org.springframework.context.annotation.Primary;

     

    import com.alibaba.druid.pool.DruidDataSource;

     

    @Configuration

    @ConfigurationProperties(prefix="spring.datasource")

    public class DataSourceConfig {

    private Logger logger=LoggerFactory.getLogger(DataSourceConfig.class);

    private String type;

    private String url;

    private String driverClassName;

    private String username;

    private String password;

    private String filters;

    private String connectionProperties;

    public String getType() {

    return type;

    }

    public void setType(String type) {

    this.type = type;

    }

    public String getUrl() {

    return url;

    }

    public void setUrl(String url) {

    this.url = url;

    }

    public String getDriverClassName() {

    return driverClassName;

    }

    public void setDriverClassName(String driverClassName) {

    this.driverClassName = driverClassName;

    }

    public String getUsername() {

    return username;

    }

    public void setUsername(String username) {

    this.username = username;

    }

    public String getPassword() {

    return password;

    }

    public void setPassword(String password) {

    this.password = password;

    }

    public String getFilters() {

    return filters;

    }

    public void setFilters(String filters) {

    this.filters = filters;

    }

    public String getConnectionProperties() {

    return connectionProperties;

    }

    public void setConnectionProperties(String connectionProperties) {

    this.connectionProperties = connectionProperties;

    }

     

    @Bean

    @Primary

    public DataSource druidDataSource()

    {

    DruidDataSource dataSource=new DruidDataSource();

    dataSource.setUrl(url);

    dataSource.setUsername(username);

    dataSource.setPassword(password);

    dataSource.setDriverClassName(driverClassName);

     

    dataSource.setConnectionProperties(connectionProperties);

    try {

    dataSource.setFilters(filters);

    } catch (SQLException e) {

    e.printStackTrace();

    }

    logger.info(">>>>>>>>>>>>>>>>>>>>>>Druid DataSource init>>>>>>>>>>>");

    return dataSource;

    }

    }

  • 7

    運行Spring boot的程序,進行視頻文件數據的上傳,檢查數據庫連接是否正常

    1)啟動Spring boot主類Application,可以看到日志輸出了自定義的DruidDataSource初始化成功

     [  restartedMain] image.dao.DataSourceConfig               : >>>>>>>>>>>>>>>>>>>>>>Druid DataSource init>>>>>>>>>>>

    2)在瀏覽器中訪問視頻上傳的功能頁面,進行視頻文件上傳,成功后可以看到數據庫插入了一條心的記錄,沒有錯誤出現,說明我們已經解決了該問題

    Spring boot+Druid使用密碼加密后不起作用案例
    Spring boot+Druid使用密碼加密后不起作用案例

  • 免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM