设置数据源加密密码

问题描述 投票:0回答:1

我的应用程序中有以下有效的数据源配置

application.yaml:

spring:
  datasource:
    batch:
      jdbcUrl: jdbc:mysql://localhost:33060/test
      username: root
      password: somepassowrd
      driver-class-name: com.mysql.cj.jdbc.Driver
      minimumIdle: 5
      maximumPoolSize: 15
      idleTimeout: 30000
      connectionTimeout: 30000
    reader:
      jdbcUrl: jdbc:mysql://localhost:3306/BL
      username: root
      password: someotherpassowrd
      driver-class-name: com.mysql.cj.jdbc.Driver
      minimumIdle: 5
      maximumPoolSize: 15
      idleTimeout: 30000
      connectionTimeout: 30000

数据源配置类:

@Configuration
class DatasourceConfiguration() {
  @Bean(name = ["batchDatasource"])
  @ConfigurationProperties(prefix = "spring.datasource.batch")
  @BatchDataSource
  fun batchDataSource(): DataSource = HikariDataSource()

  @Bean(name = ["daoDatasource"])
  @ConfigurationProperties(prefix = "spring.datasource.reader")
  @Primary
  fun readerDataSource(): DataSource = HikariDataSource()
}

正如所说,这工作得很好,但我现在有一个限制,即 application.yaml 中的密码是加密的(硬限制 - 无法更改它)。

如何在创建数据源之前解密密码?

我尝试过:

spring:
  datasource:
    batch:
      jdbcUrl: jdbc:mysql://localhost:33060/test
      username: root
      password: somepassowrd
      driver-class-name: com.mysql.cj.jdbc.Driver
      minimumIdle: 5
      maximumPoolSize: 15
      idleTimeout: 30000
      connectionTimeout: 30000
    reader:
      jdbcUrl: jdbc:mysql://localhost:3306/BL
      username: root
      password: someotherpassowrd
      driver-class-name: com.mysql.cj.jdbc.Driver
      minimumIdle: 5
      maximumPoolSize: 15
      idleTimeout: 30000
      connectionTimeout: 30000

数据源配置类:

@Configuration
class DatasourceConfiguration() {
  @Bean(name = ["batchDatasource"])
  @ConfigurationProperties(prefix = "spring.datasource.batch")
  @BatchDataSource
  fun batchDataSource(@Value("${spring.datasource.batch.password}") encryptedPassword: String): DataSource = HikariDataSource()
    .apply(password = decryptPassword(encryptedPassword))

  @Bean(name = ["daoDatasource"])
  @ConfigurationProperties(prefix = "spring.datasource.reader")
  @Primary
  fun readerDataSource(@Value("${spring.datasource.reader.password}") encryptedPassword: String): DataSource = HikariDataSource()
    .apply(password = decryptPassword(encryptedPassword))
}

但是没有成功

java spring-boot kotlin jdbc datasource
1个回答
0
投票

我能够通过一个小解决方法解决这个问题: application.yaml:

spring:
  datasource:
    batch:
      jdbcUrl: jdbc:mysql://localhost:33060/test
      username: root
      encrypted-password: somepassowrd
      driver-class-name: com.mysql.cj.jdbc.Driver
      minimumIdle: 5
      maximumPoolSize: 15
      idleTimeout: 30000
      connectionTimeout: 30000
    reader:
      jdbcUrl: jdbc:mysql://localhost:3306/BL
      username: root
      encrypted-password: someotherpassowrd
      driver-class-name: com.mysql.cj.jdbc.Driver
      minimumIdle: 5
      maximumPoolSize: 15
      idleTimeout: 30000
      connectionTimeout: 30000

数据源配置类:

@Configuration
class DatasourceConfiguration() {
  @Bean(name = ["batchDatasource"])
  @ConfigurationProperties(prefix = "spring.datasource.batch")
  @BatchDataSource
  fun batchDataSource(@Value("${spring.datasource.batch.encrypted-password}") encryptedPassword: String): DataSource = HikariDataSource()
    .apply(password = decryptPassword(encryptedPassword))

  @Bean(name = ["daoDatasource"])
  @ConfigurationProperties(prefix = "spring.datasource.reader")
  @Primary
  fun readerDataSource(@Value("${spring.datasource.reader.encrypted-password}") encryptedPassword: String): DataSource = HikariDataSource()
    .apply(password = decryptPassword(encryptedPassword))
}

说明: 我认为我在

apply
子句中设置的内容被
@ConfigurationProperties
覆盖。因此,我没有在
application.yaml
中声明密码,而是设置了一个不同的属性,然后
@ConfigurationProperties
不会覆盖密码,这样我就可以获取此属性,解密它并将其设置为
apply
子句中的密码

© www.soinside.com 2019 - 2024. All rights reserved.