From e2ee1ed50dba4536d5f11cbc3b9b269e168b3ac0 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 18 Apr 2023 11:52:50 +0100 Subject: [PATCH] Fix password handling in Flyway auto-configuration Previously, FlywayProperties returned an empty string when its password had not been set. This prevented the desired fallback to JdbcConnectionDetails. Fixes gh-35046 --- .../flyway/FlywayAutoConfiguration.java | 3 ++- .../flyway/FlywayProperties.java | 2 +- .../flyway/FlywayAutoConfigurationTests.java | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java index ce27883c6d7..adaa23347a4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration.java @@ -188,7 +188,8 @@ public class FlywayAutoConfiguration { private void applyConnectionDetails(FlywayConnectionDetails connectionDetails, DataSourceBuilder builder) { builder.username(connectionDetails.getUsername()); - builder.password(connectionDetails.getPassword()); + String password = connectionDetails.getPassword(); + builder.password((password != null) ? password : ""); String driverClassName = connectionDetails.getDriverClassName(); if (StringUtils.hasText(driverClassName)) { builder.driverClassName(driverClassName); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java index e2b315a9568..a783355be91 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/flyway/FlywayProperties.java @@ -576,7 +576,7 @@ public class FlywayProperties { } public String getPassword() { - return (this.password != null) ? this.password : ""; + return this.password; } public void setPassword(String password) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java index cb052c8343b..3c88a80d023 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java @@ -192,6 +192,28 @@ class FlywayAutoConfigurationTests { }); } + @Test + void jdbcConnectionDetailsAreUsedOverDataSourceProperties() { + this.contextRunner + .withUserConfiguration(EmbeddedDataSourceConfiguration.class, JdbcConnectionDetailsConfiguration.class, + MockFlywayMigrationStrategy.class) + .withPropertyValues("spring.datasource.url=jdbc:hsqldb:mem:flywaytest", "spring.datasource.user=some-user", + "spring.datasource.password=some-password", + "spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver") + .run((context) -> { + assertThat(context).hasSingleBean(Flyway.class); + Flyway flyway = context.getBean(Flyway.class); + DataSource dataSource = flyway.getConfiguration().getDataSource(); + assertThat(dataSource).isInstanceOf(SimpleDriverDataSource.class); + SimpleDriverDataSource simpleDriverDataSource = (SimpleDriverDataSource) dataSource; + assertThat(simpleDriverDataSource.getUrl()) + .isEqualTo("jdbc:postgresql://database.example.com:12345/database-1"); + assertThat(simpleDriverDataSource.getUsername()).isEqualTo("user-1"); + assertThat(simpleDriverDataSource.getPassword()).isEqualTo("secret-1"); + assertThat(simpleDriverDataSource.getDriver()).isInstanceOf(Driver.class); + }); + } + @Test void createDataSourceWithUser() { this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)