Skip to content

Commit 1b91259

Browse files
committed
Logout defaults to use Global SecurityContextServerLogoutHandler
Closes gh-8375
1 parent 9d3ea58 commit 1b91259

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

config/src/main/java/org/springframework/security/config/web/server/ServerHttpSecurity.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -2412,7 +2412,9 @@ private HeaderSpec() {
24122412
*/
24132413
public final class LogoutSpec {
24142414
private LogoutWebFilter logoutWebFilter = new LogoutWebFilter();
2415-
private List<ServerLogoutHandler> logoutHandlers = new ArrayList<>(Arrays.asList(new SecurityContextServerLogoutHandler()));
2415+
private final SecurityContextServerLogoutHandler DEFAULT_LOGOUT_HANDLER = new SecurityContextServerLogoutHandler();
2416+
private List<ServerLogoutHandler> logoutHandlers = new ArrayList<>(Arrays.asList(this.DEFAULT_LOGOUT_HANDLER));
2417+
24162418

24172419
/**
24182420
* Configures the logout handler. Default is {@code SecurityContextServerLogoutHandler}
@@ -2476,6 +2478,10 @@ public ServerHttpSecurity disable() {
24762478
}
24772479

24782480
private Optional<ServerLogoutHandler> createLogoutHandler() {
2481+
ServerSecurityContextRepository securityContextRepository = ServerHttpSecurity.this.securityContextRepository;
2482+
if (securityContextRepository != null) {
2483+
this.DEFAULT_LOGOUT_HANDLER.setSecurityContextRepository(securityContextRepository);
2484+
}
24792485
if (this.logoutHandlers.isEmpty()) {
24802486
return Optional.empty();
24812487
}

config/src/test/java/org/springframework/security/config/web/server/LogoutSpecTests.java

+42
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.security.config.annotation.web.reactive.ServerHttpSecurityConfigurationBuilder;
2222
import org.springframework.security.htmlunit.server.WebTestClientHtmlUnitDriverBuilder;
2323
import org.springframework.security.web.server.SecurityWebFilterChain;
24+
import org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository;
2425
import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers;
2526
import org.springframework.test.web.reactive.server.WebTestClient;
2627
import org.springframework.security.test.web.reactive.server.WebTestClientBuilder;
@@ -117,4 +118,45 @@ public void customLogout() {
117118
.assertAt()
118119
.assertLogout();
119120
}
121+
122+
@Test
123+
public void logoutWhenCustomSecurityContextRepositoryThenLogsOut() {
124+
WebSessionServerSecurityContextRepository repository = new WebSessionServerSecurityContextRepository();
125+
repository.setSpringSecurityContextAttrName("CUSTOM_CONTEXT_ATTR");
126+
SecurityWebFilterChain securityWebFilter = this.http
127+
.securityContextRepository(repository)
128+
.authorizeExchange()
129+
.anyExchange().authenticated()
130+
.and()
131+
.formLogin()
132+
.and()
133+
.logout()
134+
.and()
135+
.build();
136+
137+
WebTestClient webTestClient = WebTestClientBuilder
138+
.bindToWebFilters(securityWebFilter)
139+
.build();
140+
141+
WebDriver driver = WebTestClientHtmlUnitDriverBuilder
142+
.webTestClientSetup(webTestClient)
143+
.build();
144+
145+
FormLoginTests.DefaultLoginPage loginPage = FormLoginTests.HomePage.to(driver, FormLoginTests.DefaultLoginPage.class)
146+
.assertAt();
147+
148+
FormLoginTests.HomePage homePage = loginPage.loginForm()
149+
.username("user")
150+
.password("password")
151+
.submit(FormLoginTests.HomePage.class);
152+
153+
homePage.assertAt();
154+
155+
FormLoginTests.DefaultLogoutPage.to(driver)
156+
.assertAt()
157+
.logout();
158+
159+
FormLoginTests.HomePage.to(driver, FormLoginTests.DefaultLoginPage.class)
160+
.assertAt();
161+
}
120162
}

0 commit comments

Comments
 (0)