Skip to content

Commit ef0fd1c

Browse files
committed
Merge pull request #41511 from theodorosidmar
* gh-41511: Polish "Add support for Postgres trust host auth method with Docker Compose" Add support for Postgres trust host auth method with Docker Compose Closes gh-41511
2 parents 6fd049c + 3b13490 commit ef0fd1c

File tree

6 files changed

+80
-0
lines changed

6 files changed

+80
-0
lines changed

spring-boot-project/spring-boot-docker-compose/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ dependencies {
2121
dockerTestRuntimeOnly("com.microsoft.sqlserver:mssql-jdbc")
2222
dockerTestRuntimeOnly("com.oracle.database.r2dbc:oracle-r2dbc")
2323
dockerTestRuntimeOnly("io.r2dbc:r2dbc-mssql")
24+
dockerTestRuntimeOnly("org.postgresql:postgresql")
25+
dockerTestRuntimeOnly("org.postgresql:r2dbc-postgresql")
2426

2527
implementation("com.fasterxml.jackson.core:jackson-databind")
2628
implementation("com.fasterxml.jackson.module:jackson-module-parameter-names")

spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresJdbcDockerComposeConnectionDetailsFactoryIntegrationTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@
1616

1717
package org.springframework.boot.docker.compose.service.connection.postgres;
1818

19+
import java.sql.Driver;
20+
1921
import org.junit.jupiter.api.Test;
2022

2123
import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails;
2224
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
25+
import org.springframework.boot.jdbc.DatabaseDriver;
2326
import org.springframework.boot.testsupport.container.TestImage;
27+
import org.springframework.jdbc.core.JdbcTemplate;
28+
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
29+
import org.springframework.util.ClassUtils;
2430

2531
import static org.assertj.core.api.Assertions.assertThat;
2632

@@ -39,6 +45,15 @@ void runCreatesConnectionDetails(JdbcConnectionDetails connectionDetails) {
3945
assertConnectionDetails(connectionDetails);
4046
}
4147

48+
@DockerComposeTest(composeFile = "postgres-with-trust-host-auth-method-compose.yaml", image = TestImage.POSTGRESQL)
49+
void runCreatesConnectionDetailsThatCanAccessDatabaseWhenHostAuthMethodIsTrust(
50+
JdbcConnectionDetails connectionDetails) throws ClassNotFoundException {
51+
assertThat(connectionDetails.getUsername()).isEqualTo("myuser");
52+
assertThat(connectionDetails.getPassword()).isNull();
53+
assertThat(connectionDetails.getJdbcUrl()).startsWith("jdbc:postgresql://").endsWith("/mydatabase");
54+
checkDatabaseAccess(connectionDetails);
55+
}
56+
4257
@Test
4358
@DockerComposeTest(composeFile = "postgres-bitnami-compose.yaml", image = TestImage.BITNAMI_POSTGRESQL)
4459
void runWithBitnamiImageCreatesConnectionDetails(JdbcConnectionDetails connectionDetails) {
@@ -51,4 +66,16 @@ private void assertConnectionDetails(JdbcConnectionDetails connectionDetails) {
5166
assertThat(connectionDetails.getJdbcUrl()).startsWith("jdbc:postgresql://").endsWith("/mydatabase");
5267
}
5368

69+
@SuppressWarnings("unchecked")
70+
private void checkDatabaseAccess(JdbcConnectionDetails connectionDetails) throws ClassNotFoundException {
71+
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
72+
dataSource.setUrl(connectionDetails.getJdbcUrl());
73+
dataSource.setUsername(connectionDetails.getUsername());
74+
dataSource.setPassword(connectionDetails.getPassword());
75+
dataSource.setDriverClass((Class<? extends Driver>) ClassUtils.forName(connectionDetails.getDriverClassName(),
76+
getClass().getClassLoader()));
77+
JdbcTemplate template = new JdbcTemplate(dataSource);
78+
assertThat(template.queryForObject(DatabaseDriver.POSTGRESQL.getValidationQuery(), Integer.class)).isEqualTo(1);
79+
}
80+
5481
}

spring-boot-project/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresR2dbcDockerComposeConnectionDetailsFactoryIntegrationTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@
1616

1717
package org.springframework.boot.docker.compose.service.connection.postgres;
1818

19+
import java.time.Duration;
20+
21+
import io.r2dbc.spi.ConnectionFactories;
1922
import io.r2dbc.spi.ConnectionFactoryOptions;
2023

2124
import org.springframework.boot.autoconfigure.r2dbc.R2dbcConnectionDetails;
2225
import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest;
26+
import org.springframework.boot.jdbc.DatabaseDriver;
2327
import org.springframework.boot.testsupport.container.TestImage;
28+
import org.springframework.r2dbc.core.DatabaseClient;
2429

2530
import static org.assertj.core.api.Assertions.assertThat;
2631

@@ -39,6 +44,17 @@ void runCreatesConnectionDetails(R2dbcConnectionDetails connectionDetails) {
3944
assertConnectionDetails(connectionDetails);
4045
}
4146

47+
@DockerComposeTest(composeFile = "postgres-with-trust-host-auth-method-compose.yaml", image = TestImage.POSTGRESQL)
48+
void runCreatesConnectionDetailsThatCanAccessDatabaseWhenHostAuthMethodIsTrust(
49+
R2dbcConnectionDetails connectionDetails) {
50+
ConnectionFactoryOptions connectionFactoryOptions = connectionDetails.getConnectionFactoryOptions();
51+
assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.USER)).isEqualTo("myuser");
52+
assertThat(connectionFactoryOptions.getValue(ConnectionFactoryOptions.PASSWORD)).isNull();
53+
assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.DATABASE))
54+
.isEqualTo("mydatabase");
55+
checkDatabaseAccess(connectionDetails);
56+
}
57+
4258
@DockerComposeTest(composeFile = "postgres-bitnami-compose.yaml", image = TestImage.BITNAMI_POSTGRESQL)
4359
void runWithBitnamiImageCreatesConnectionDetails(R2dbcConnectionDetails connectionDetails) {
4460
assertConnectionDetails(connectionDetails);
@@ -51,4 +67,14 @@ private void assertConnectionDetails(R2dbcConnectionDetails connectionDetails) {
5167
assertThat(connectionFactoryOptions.getRequiredValue(ConnectionFactoryOptions.PASSWORD)).isEqualTo("secret");
5268
}
5369

70+
private void checkDatabaseAccess(R2dbcConnectionDetails connectionDetails) {
71+
ConnectionFactoryOptions connectionFactoryOptions = connectionDetails.getConnectionFactoryOptions();
72+
Object result = DatabaseClient.create(ConnectionFactories.get(connectionFactoryOptions))
73+
.sql(DatabaseDriver.POSTGRESQL.getValidationQuery())
74+
.map((row, metadata) -> row.get(0))
75+
.first()
76+
.block(Duration.ofSeconds(30));
77+
assertThat(result).isEqualTo(1);
78+
}
79+
5480
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
services:
2+
database:
3+
image: '{imageName}'
4+
ports:
5+
- '5432'
6+
environment:
7+
- 'POSTGRES_USER=myuser'
8+
- 'POSTGRES_DB=mydatabase'
9+
- 'POSTGRES_HOST_AUTH_METHOD=trust'

spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironment.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
* @author Andy Wilkinson
2929
* @author Phillip Webb
3030
* @author Scott Frederick
31+
* @author Sidmar Theodoro
3132
*/
3233
class PostgresEnvironment {
3334

@@ -44,11 +45,19 @@ class PostgresEnvironment {
4445
}
4546

4647
private String extractPassword(Map<String, String> env) {
48+
if (hasTrustHostAuthMethod(env)) {
49+
return null;
50+
}
4751
String password = env.getOrDefault("POSTGRES_PASSWORD", env.get("POSTGRESQL_PASSWORD"));
4852
Assert.state(StringUtils.hasLength(password), "PostgreSQL password must be provided");
4953
return password;
5054
}
5155

56+
private Boolean hasTrustHostAuthMethod(Map<String, String> env) {
57+
String hostAuthMethod = env.get("POSTGRES_HOST_AUTH_METHOD");
58+
return "trust".equals(hostAuthMethod);
59+
}
60+
5261
String getUsername() {
5362
return this.username;
5463
}

spring-boot-project/spring-boot-docker-compose/src/test/java/org/springframework/boot/docker/compose/service/connection/postgres/PostgresEnvironmentTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
* @author Andy Wilkinson
3232
* @author Phillip Webb
3333
* @author Scott Frederick
34+
* @author Sidmar Theodoro
3435
*/
3536
class PostgresEnvironmentTests {
3637

@@ -78,6 +79,12 @@ void getPasswordWhenHasPostgresqlPassword() {
7879
assertThat(environment.getPassword()).isEqualTo("secret");
7980
}
8081

82+
@Test
83+
void getPasswordWhenHasTrustHostAuthMethod() {
84+
PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_HOST_AUTH_METHOD", "trust"));
85+
assertThat(environment.getPassword()).isNull();
86+
}
87+
8188
@Test
8289
void getDatabaseWhenNoPostgresDbOrPostgresUser() {
8390
PostgresEnvironment environment = new PostgresEnvironment(Map.of("POSTGRES_PASSWORD", "secret"));

0 commit comments

Comments
 (0)