Skip to content

Commit 394f74c

Browse files
committed
Validate Spring Session database initializer configuration
This commit adds Spring Session JDBC configuration validation that disables database initializer in case custom table name is configured with default schema.
1 parent 2d1e85c commit 394f74c

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19+
import javax.annotation.PostConstruct;
1920
import javax.sql.DataSource;
2021

2122
import org.springframework.beans.factory.annotation.Autowired;
2223
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2324
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
26+
import org.springframework.boot.autoconfigure.session.SessionProperties.Jdbc;
2527
import org.springframework.context.annotation.Bean;
2628
import org.springframework.context.annotation.Conditional;
2729
import org.springframework.context.annotation.Configuration;
@@ -56,13 +58,28 @@ public JdbcSessionDatabaseInitializer jdbcSessionDatabaseInitializer(
5658
public static class SpringBootJdbcHttpSessionConfiguration
5759
extends JdbcHttpSessionConfiguration {
5860

61+
private SessionProperties sessionProperties;
62+
5963
@Autowired
6064
public void customize(SessionProperties sessionProperties) {
61-
Integer timeout = sessionProperties.getTimeout();
65+
this.sessionProperties = sessionProperties;
66+
Integer timeout = this.sessionProperties.getTimeout();
6267
if (timeout != null) {
6368
setMaxInactiveIntervalInSeconds(timeout);
6469
}
65-
setTableName(sessionProperties.getJdbc().getTableName());
70+
setTableName(this.sessionProperties.getJdbc().getTableName());
71+
}
72+
73+
@PostConstruct
74+
public void checkInitializerConfig() {
75+
Jdbc jdbcProperties = this.sessionProperties.getJdbc();
76+
if (jdbcProperties.getInitializer().isEnabled()) {
77+
if (Jdbc.DEFAULT_SCHEMA_LOCATION.equals(jdbcProperties.getSchema()) &&
78+
!Jdbc.DEFAULT_TABLE_NAME.equals(jdbcProperties.getTableName())) {
79+
throw new IllegalStateException("Database initializer cannot be " +
80+
"configured using custom table name and default schema");
81+
}
82+
}
6683
}
6784

6885
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,11 @@ public void setMapName(String mapName) {
104104

105105
public static class Jdbc {
106106

107-
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
107+
static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
108108
+ "session/jdbc/schema-@@platform@@.sql";
109109

110+
static final String DEFAULT_TABLE_NAME = "SPRING_SESSION";
111+
110112
/**
111113
* Path to the SQL file to use to initialize the database schema.
112114
*/
@@ -115,7 +117,7 @@ public static class Jdbc {
115117
/**
116118
* Name of database table used to store sessions.
117119
*/
118-
private String tableName = "SPRING_SESSION";
120+
private String tableName = DEFAULT_TABLE_NAME;
119121

120122
private final Initializer initializer = new Initializer();
121123

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,15 @@
2323
import org.junit.rules.ExpectedException;
2424

2525
import org.springframework.beans.DirectFieldAccessor;
26+
import org.springframework.beans.factory.BeanCreationException;
2627
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
2829
import org.springframework.jdbc.BadSqlGrammarException;
2930
import org.springframework.jdbc.core.JdbcOperations;
3031
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
3132

3233
import static org.assertj.core.api.Assertions.assertThat;
34+
import static org.hamcrest.CoreMatchers.containsString;
3335

3436
/**
3537
* JDBC specific tests for {@link SessionAutoConfiguration}.
@@ -86,4 +88,15 @@ public void customTableName() {
8688
.queryForList("select * from FOO_BAR")).isEmpty();
8789
}
8890

91+
@Test
92+
public void customTableNameWithDefaultSchemaFails() {
93+
this.thrown.expect(BeanCreationException.class);
94+
this.thrown.expectMessage(containsString(
95+
"Database initializer cannot be configured"));
96+
load(Arrays.asList(EmbeddedDataSourceConfiguration.class,
97+
DataSourceTransactionManagerAutoConfiguration.class),
98+
"spring.session.store-type=jdbc",
99+
"spring.session.jdbc.table-name=FOO_BAR");
100+
}
101+
89102
}

0 commit comments

Comments
 (0)