Spring boot 如何从密码hashicorp vault动态读取liquibase.properties
在我的SpringBoot项目中,我试图设置liquibase并在开发、测试和生产数据库之间使用它。除了将凭证从HashiCorp Vault传递到Spring boot 如何从密码hashicorp vault动态读取liquibase.properties,spring-boot,liquibase,liquibase-hibernate,spring-cloud-vault-config,Spring Boot,Liquibase,Liquibase Hibernate,Spring Cloud Vault Config,在我的SpringBoot项目中,我试图设置liquibase并在开发、测试和生产数据库之间使用它。除了将凭证从HashiCorp Vault传递到liquibase.properties文件之外,一切似乎都很正常。我可以在application.properties中访问凭据,但在liquibase.properties文件中无法访问凭据。我有以下文件,我想从密码库动态传递URL和凭据 液化资产 changeLogFile=src/main/resources/liquibase-change
liquibase.properties
文件之外,一切似乎都很正常。我可以在application.properties
中访问凭据,但在liquibase.properties
文件中无法访问凭据。我有以下文件,我想从密码库动态传递URL和凭据
液化资产
changeLogFile=src/main/resources/liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=hibernate:spring:org.baeldung.persistence.model
?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
liquibase.properties
由liquibase直接使用。我不确定spring是否以某种方式修改了liquibase.properties
,它可能只被maven插件使用。因此,您需要在liquibase中创建一些额外的解析器,这些解析器可以使用Vault,也可以忘记liquibase.properties并使用spring的属性。下面的代码从Vault中获取db详细信息,并将其注入到数据源中,liquibase使用此数据源连接和执行脚本
build.gradle.kts
应用程序属性
Vault数据库配置
数据库配置
在application.kt中启用配置属性
我在发帖后意识到了这一点。对于那些正在寻找答案并找到此帖子的人<当使用liquibase Maven插件迁移数据库更改时,将使用code>liquibase.properties文件。但是如果您想使用
liquibase-hibernate5
依赖项,只需使用application.properties
文件即可
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.4.4"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.4.31"
kotlin("plugin.spring") version "1.4.31"
}
group = "com.db"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8
configurations {
compileOnly {
extendsFrom(configurations.annotationProcessor.get())
}
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.cloud:spring-cloud-starter-bootstrap:3.0.2")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.liquibase:liquibase-core:4.3.2")
implementation(files("libs/ojdbc6.jar"))
implementation("org.springframework.cloud:spring-cloud-starter-vault-config:3.0.2")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
spring.cloud.vault.application-name=database-config
spring.cloud.vault.token=XXXXX
spring.cloud.vault.scheme=http
spring.cloud.vault.kv.enabled=true
spring.cloud.vault.host=localhost
spring.cloud.vault.port=8200
logging.level.liquibase=DEBUG
spring.liquibase.change-log=classpath:db/changelog.xml
spring.liquibase.enabled=true
import org.springframework.boot.context.properties.ConfigurationProperties
@ConfigurationProperties("db")
class VaultDBConfig {
var username: String? = null
var password: String? = null
var url: String? = null
}
import oracle.jdbc.pool.OracleDataSource
import java.sql.SQLException
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import org.springframework.context.annotation.Profile
import org.springframework.core.env.Environment
import javax.sql.DataSource
@Configuration
class DatabaseConfig(private val dbDetails: VaultDBConfig, private val environment: Environment) {
val logger: Logger = LoggerFactory.getLogger(DatabaseConfig::class.java)
@Primary
@Bean
@Throws(SQLException::class)
fun dataSource(): DataSource? {
val oracleDataSource = OracleDataSource()
oracleDataSource.setURL(dbDetails.url)
oracleDataSource.setUser(dbDetails.username)
oracleDataSource.setPassword(dbDetails.password)
return oracleDataSource
}
}
@SpringBootApplication
@EnableConfigurationProperties(VaultDBConfig::class)
class ConfigApplication
fun main(args: Array<String>) {
runApplication<ConfigApplication>(*args)
}
vault kv put secret/database-config db.username=xxx db.password=xxx dp.url=xxx