多语言展示
当前在线:223今日阅读:57今日分享:41

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

在配置文件中直接使用明文保存数据库连接的用户密码,这种方式是不安全的,所以我们需要对该密码进行加密保存,让后在使用中进行解密处理,这里介绍如何使用Druid进行密码加密配置和使用。
工具/原料
1

Spring boot

2

Druid

方法/步骤
1

首先我们使用Druid包的自带密码加密工具对我们的密码进行加密如下所示,我们可以得到私钥、公钥和密码密文:C:\Users\Administrator>cd /d C:\Users\Administrator\.m2\repository\com\alibaba\druid\1.1.6C:\Users\Administrator\.m2\repository\com\alibaba\druid\1.1.6>java  -cp druid-1.1.6.jar com.alibaba.druid.filter.config.ConfigTools passwordprivateKey:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAlwfk3zil6HQGe8QFz9UbttPds8k/JgEm6/feCl4cCmFW1DP7PKD2/TLFZCoeFFRhC1hqOEBhpadrR013huuFTQIDAQABAkAr4Cg2TP+twx8rD2xcz11IxM3wb/N/d/A1twFzY5mjzeXihuoZrefje1WN2q36YhAiEA5GgcdSV0qwYxAkUS24tgFp1EPlTmNKAa2YRWYUNUJkCIQCpRsuO9PrEVf8morsx5VousmyapnoOtW5Y7663zp7m1QIgb8sZaqkbkn3kTPUcBsMQE+GDvnJ1fnqCyrneQg+idbkCIGmzXkqPKMNOm7upY9C9UXnVSkGrcI4ctqHsUKJP8CNdAiEAnr2gYIT1EO3dPVpTyguKCxpawMnhQ/biwDUyzYb5mAw=publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJcH5N84peh0BnvEBc/VG7bT3bPJPyYBJuv33gpeHAphVtQz+zyg9v0yxWQqHhRUYQtYajhAYaWna0dNd4brhU0CAwEAAQ==password:gXhFklHpK8L6Z39gjA0lFccC7zHREii6FLXtW43h8yqH+47Hbat6URMhX6R3X4qMunhpxfWlisoZXqnFLlbEcw==

2

在Spring boot的配置文件中配置密码和config filter.spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.url=jdbc:mysql://127.0.0.1:3306/videoDBspring.datasource.username=rootspring.datasource.password=passwordspring.datasource.filters=stat,log4j,wall,configspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.maxActive=20spring.datasource.max-idle=10spring.datasource.max-wait=10000spring.datasource.min-idle=5spring.datasource.initial-size=5

3

配置数据源的用户密码以及解密的配置选项,password和connectionProperties属性:spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.url=jdbc:mysql://127.0.0.1:3306/videoDBspring.datasource.username=rootspring.datasource.password=gXhFklHpK8L6Z39gjA0lFccC7zHREii6FLXtW43h8yqH+47Hbat6URMhX6R3X4qMunhpxfWlisoZXqnFLlbEcw==spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.filters=stat,log4j,wall,configspring.datasource.connectionProperties=config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJcH5N84peh0BnvEBc/VG7bT3bPJPyYBJuv33gpeHAphVtQz+zyg9v0yxWQqHhRUYQtYajhAYaWna0dNd4brhU0CAwEAAQ==

4

启动Spring boot应用进行测试1)启动Application2)测试有数据库连接服务的操作,如视频文件的上传这时候可以测试可以知道数据库信息入库失败,日志提示数据库连接失败: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 28000java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)3)说明我们配置的解密过滤器没有生效,这也说明了根据Spring Boot+Druid是存在兼容性问题的,因为官方的样例是使用Spring+Druid的模式

5

最后得到的结论是:Druid与Spring Boot的兼容性问题还是比较多的,不建议使用该组合。从项目提交的问题来看,也体现出与Spring Boot的兼容性问题,具体问题如下图所示。

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; }}

推荐信息