springboot中druid数据源配置文件密码加密显示

运维和DBA都不希望把密码明文直接写在项目配置文件中,Druid提供了数据库密码加密的功能,一种数据库密码加密的手段ConfigFilter。

 

引入jar

			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid-spring-boot-starter</artifactId>
				<version>1.1.10</version>
			</dependency>

1、application.properties(公共参数)

spring.profiles.active=dev

server.port=80
server.servlet.context-path=/
server.tomcat.uri-encoding=UTF-8


############ logging config start ###############
logging.level.priv.hhp.cas.server=info
logging.pattern.console=%d %5p [%F:%L] : %m%n
logging.pattern.file=[%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}][%C{1}:%L] %m%n
logging.path=logs
logging.file=logs/cas-server.log
############## logging config end ###############


##################### 模板配置 start ####################
spring.thymeleaf.cache=false
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.check-template-location=true
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
##################### 模板配置  end ####################


###################### 返回 Date 类型 json 格式化 #####################
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#spring-boot中对于@RestController或者@Controller+@ResponseBody注解的接口方法的返回值默认是Json格式,
# 所以当对于date类型的数据,在返回浏览器端是会被spring-boot默认的Jackson框架转换,
# 而Jackson框架默认的时区GMT(相对于中国是少了8小时)所以在application.yml中增加
spring.jackson.time-zone=GMT+8

该配置文件为springboot的默认加载文件,其中包含有一些公共配置

2、application-dev.yml(数据源配置)

# Spring Datasource Settings
spring:
  datasource:
      name: druidDataSource
      type: com.alibaba.druid.pool.DruidDataSource
      druid:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
        username: root
#        password: 123456
#        password: ${password}
#        password: config.file=classpath:conf/${spring.profiles.active}/druid.properties?password
        password: config.file=classpath:conf/${spring.profiles.active}/druid.properties
        filters: stat,wall,log4j,config
        max-active: 100
        initial-size: 1
        max-wait: 60000
        min-idle: 1
        db-type: mysql
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        validation-query: select 'x'
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
        pool-prepared-statements: true
        max-open-prepared-statements: 50
        max-pool-prepared-statement-per-connection-size: 20
#        connection-properties: config.decrypt=true;config.decrypt.key=${public-key}   # 启用加密,配置公钥。
        connection-properties: config.file=classpath:conf/${spring.profiles.active}/druid.properties   # 启用加密,配置公钥。
        filter:
          config:
            enabled: true   # 数据库过滤器
            
      
#      说明: 
# spring.datasource.druid.max-active 最大连接数 
# spring.datasource.druid.initial-size 初始化大小 
# spring.datasource.druid.min-idle 最小连接数 
# spring.datasource.druid.max-wait 获取连接等待超时时间 
# spring.datasource.druid.time-between-eviction-runs-millis 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 
# spring.datasource.druid.min-evictable-idle-time-millis 一个连接在池中最小生存的时间,单位是毫秒 
# spring.datasource.druid.filters=config,stat,wall,log4j 配置监控统计拦截的filters,去掉后监控界面SQL无法进行统计,’wall’用于防火墙

该配置文件包含有数据库配置,以及其他一些配置(此地俺属于本地环境配置)

 

3、druid.properties(数据库加密密码、key以及其他参数)

# 是否加密数据库密码(该config.decrypt属性名不可更改)
config.decrypt=true
# 加密后的数据库密码(该password属性名最好与数据源配置的password一致)
password=XQ/khbjTdCEQ5qqe+lwaCVeoGicM2KlUqIuTjRKzByMs5spscVKDDhRe0S6FtSDMP4jdHxT4tJSNoGmqiFPEYw==
# 用 publicKey 解密 (该config.decrypt.key属性名不可更改)
config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAISyIUgplr69/Fc9+lkikYuXckw6pB8dBkRdcQyy9XGvQVWs4tpZb4YUIW80DaiKF9J++8N0acHJj83vduJrMC8CAwEAAQ==

# 不加密配置
#config.decrypt=false
#password=123456

druid.properties中的加密密码和key生成方式:

方式一

public class EncryptPwdUtil {
    
    public static void main(String[] args) {
	try {
	    String password = "123456";
	    String[] arr = ConfigTools.genKeyPair(512);
	    
	   // System.out.println("privateKey:" + arr[0]);
	    System.out.println("publicKey:" + arr[1]);
	    System.out.println("password:" + ConfigTools.encrypt(arr[0], password));
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
}

 

方式二

在cmd控制台运行以下命令

          java -cp druid-1.1.10.jar com.alibaba.druid.filter.config.ConfigTools 你的密码

将生成的password和publicKey复制过来即可

切记:项目中引入的druid jar包版本和密码加密版本要对应,且加密的key和生成密码要对应(每次更换都更换),如:

俺都用的druid-1.1.10.jar   需要更换的时候全部重新替换。

具体看这里(druid官方): https://github.com/alibaba/druid/wiki/使用ConfigFilter

注意事项


  • 如果启动报错如下:
Caused by: java.lang.IllegalArgumentException: Failed to decrypt.

Caused by: javax.crypto.BadPaddingException: Decryption error

可能出错原因:

  1. config.decrypt.key  属性写错了;
  2. config.decrypt.key  取值错误,或许密码和该值不对应,不是同一次生成的,全部重新生成;
  • 如果报错如下:
Caused by: java.lang.IllegalArgumentException: Failed to decrypt.
	
Caused by: java.lang.IllegalArgumentException: String length must be a multiple of four.

可能出错原因:

  1. password没取到值,password属性写错了,因为默认去跟其一样的属性值;
  2. password值为空。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,关于Spring Boot使用Druid实现多数据源配置,你可以按照以下步骤进行操作: 1. 添加Druid和JDBC依赖 在pom.xml文件,添加以下依赖: ```xml <!-- Druid依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency> <!-- JDBC依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 2. 配置Druid数据源 在application.yml配置文件,添加Druid数据源的配置,包括主数据源和从数据源的配置,例如: ```yml spring: datasource: master: url: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # Druid配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 filters: stat,wall,log4j connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 slave: url: jdbc:mysql://localhost:3306/db_slave?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # Druid配置 initialSize: 5 minIdle: 5 maxActive: 20 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 filters: stat,wall,log4j connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` 3. 配置数据源路由 在配置类,使用@Primary注解指定主数据源,使用@Qualifier注解指定从数据源,使用@DependsOn注解保证数据源初始化顺序,例如: ```java @Configuration public class DataSourceConfig { @Primary @Bean(name = "masterDataSource") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "slaveDataSource") @ConfigurationProperties(prefix = "spring.datasource.slave") @DependsOn("masterDataSource") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @DependsOn({"masterDataSource", "slaveDataSource"}) public DataSourceRouting dataSourceRouting(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("slaveDataSource") DataSource slaveDataSource) { return new DataSourceRouting(masterDataSource, slaveDataSource); } } ``` 4. 配置数据源切换 使用ThreadLocal实现数据源切换,例如: ```java public class DataSourceRouting { private final ThreadLocal<String> dataSourceKey = new ThreadLocal<>(); private final DataSource masterDataSource; private final DataSource slaveDataSource; public DataSourceRouting(DataSource masterDataSource, DataSource slaveDataSource) { this.masterDataSource = masterDataSource; this.slaveDataSource = slaveDataSource; } public DataSource determineDataSource() { String key = dataSourceKey.get(); if (key != null && !key.isEmpty()) { if ("master".equals(key)) { return masterDataSource; } else if ("slave".equals(key)) { return slaveDataSource; } } return masterDataSource; } public void setDataSourceKey(String key) { dataSourceKey.set(key); } public void clearDataSourceKey() { dataSourceKey.remove(); } } ``` 5. 在需要切换数据源的地方调用setDataSourceKey方法进行切换 例如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Autowired private DataSourceRouting dataSourceRouting; @Override public User getUserById(Long id) { dataSourceRouting.setDataSourceKey("slave"); User user = userDao.getUserById(id); dataSourceRouting.clearDataSourceKey(); return user; } @Override @Transactional public void addUser(User user) { dataSourceRouting.setDataSourceKey("master"); userDao.addUser(user); dataSourceRouting.clearDataSourceKey(); } } ``` 以上就是使用Druid实现Spring Boot多数据源配置的步骤,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值