Skip to content

Commit 5e02541

Browse files
vpavicsnicoll
authored andcommitted
Improve DefaultCookieSerializer auto-configuration
Spring Session's own configuration support (i.e. SpringHttpSessionConfiguration) will configure the default DefaultCookieSerializer with rememberMeRequestAttribute if SpringSessionRememberMeServices bean has been detected in the application context. In contrast, Spring Boot's auto-configured DefaultCookieSerializer does not do this which results in a different out-of-the-box experience for users that rely on Spring Session's remember-me integration. This commit improves Spring Session DefaultCookieSerializer auto-configuration to match Spring Session's behavior and make the auto-configured DefaultCookieSerializer aware of SpringSessionRememberMeServices bean. See gh-16513
1 parent 50bcfd2 commit 5e02541

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.springframework.session.ReactiveSessionRepository;
5757
import org.springframework.session.Session;
5858
import org.springframework.session.SessionRepository;
59+
import org.springframework.session.security.web.authentication.SpringSessionRememberMeServices;
5960
import org.springframework.session.web.http.CookieHttpSessionIdResolver;
6061
import org.springframework.session.web.http.CookieSerializer;
6162
import org.springframework.session.web.http.DefaultCookieSerializer;
@@ -89,6 +90,14 @@ public class SessionAutoConfiguration {
8990
SessionRepositoryFilterConfiguration.class })
9091
static class ServletSessionConfiguration {
9192

93+
private final SpringSessionRememberMeServices springSessionRememberMeServices;
94+
95+
ServletSessionConfiguration(
96+
ObjectProvider<SpringSessionRememberMeServices> springSessionRememberMeServices) {
97+
this.springSessionRememberMeServices = springSessionRememberMeServices
98+
.getIfAvailable();
99+
}
100+
92101
@Bean
93102
@Conditional(DefaultCookieSerializerCondition.class)
94103
public DefaultCookieSerializer cookieSerializer(
@@ -103,6 +112,10 @@ public DefaultCookieSerializer cookieSerializer(
103112
map.from(cookie::getSecure).to(cookieSerializer::setUseSecureCookie);
104113
map.from(cookie::getMaxAge).to((maxAge) -> cookieSerializer
105114
.setCookieMaxAge((int) maxAge.getSeconds()));
115+
if (this.springSessionRememberMeServices != null) {
116+
cookieSerializer.setRememberMeRequestAttribute(
117+
SpringSessionRememberMeServices.REMEMBER_ME_LOGIN_ATTR);
118+
}
106119
return cookieSerializer;
107120
}
108121

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.session.MapSessionRepository;
3535
import org.springframework.session.SessionRepository;
3636
import org.springframework.session.config.annotation.web.http.EnableSpringHttpSession;
37+
import org.springframework.session.security.web.authentication.SpringSessionRememberMeServices;
3738
import org.springframework.session.web.http.CookieHttpSessionIdResolver;
3839
import org.springframework.session.web.http.DefaultCookieSerializer;
3940
import org.springframework.session.web.http.HeaderHttpSessionIdResolver;
@@ -245,6 +246,19 @@ public void autoConfiguredCookieSerializerBacksOffWhenUserConfiguresCustomHttpSe
245246
context.getBeansOfType(DefaultCookieSerializer.class)).isEmpty());
246247
}
247248

249+
@Test
250+
public void autoConfiguredCookieSerializerIsConfiguredWithRememberMeRequestAttribute() {
251+
this.contextRunner
252+
.withUserConfiguration(SpringSessionRememberMeServicesConfiguration.class)
253+
.run((context) -> {
254+
DefaultCookieSerializer cookieSerializer = context
255+
.getBean(DefaultCookieSerializer.class);
256+
assertThat(cookieSerializer).hasFieldOrPropertyWithValue(
257+
"rememberMeRequestAttribute",
258+
SpringSessionRememberMeServices.REMEMBER_ME_LOGIN_ATTR);
259+
});
260+
}
261+
248262
@Configuration
249263
@EnableSpringHttpSession
250264
static class SessionRepositoryConfiguration {
@@ -309,4 +323,16 @@ public HttpSessionIdResolver httpSessionStrategy() {
309323

310324
}
311325

326+
@Configuration
327+
@EnableSpringHttpSession
328+
static class SpringSessionRememberMeServicesConfiguration
329+
extends SessionRepositoryConfiguration {
330+
331+
@Bean
332+
public SpringSessionRememberMeServices rememberMeServices() {
333+
return new SpringSessionRememberMeServices();
334+
}
335+
336+
}
337+
312338
}

0 commit comments

Comments
 (0)