Skip to content

Commit edb6cd3

Browse files
committed
Fix authenticationFailureHandler not being used
The custom server authenticationFailureHandler was not always picked up Fixes: gh-7782
1 parent 2dbedf7 commit edb6cd3

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3050,7 +3050,9 @@ public FormLoginSpec loginPage(String loginPage) {
30503050
this.defaultEntryPoint = new RedirectServerAuthenticationEntryPoint(loginPage);
30513051
this.authenticationEntryPoint = this.defaultEntryPoint;
30523052
this.requiresAuthenticationMatcher = ServerWebExchangeMatchers.pathMatchers(HttpMethod.POST, loginPage);
3053-
this.authenticationFailureHandler = new RedirectServerAuthenticationFailureHandler(loginPage + "?error");
3053+
if (this.authenticationFailureHandler == null) {
3054+
this.authenticationFailureHandler = new RedirectServerAuthenticationFailureHandler(loginPage + "?error");
3055+
}
30543056
return this;
30553057
}
30563058

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.security.test.web.reactive.server.WebTestClientBuilder;
3434
import org.springframework.security.web.server.SecurityWebFilterChain;
3535
import org.springframework.security.web.server.WebFilterChainProxy;
36+
import org.springframework.security.web.server.authentication.RedirectServerAuthenticationFailureHandler;
3637
import org.springframework.security.web.server.authentication.RedirectServerAuthenticationSuccessHandler;
3738
import org.springframework.security.web.server.context.ServerSecurityContextRepository;
3839
import org.springframework.security.web.server.csrf.CsrfToken;
@@ -213,6 +214,37 @@ public void formLoginWhenCustomLoginPageInLambdaThenUsed() {
213214
homePage.assertAt();
214215
}
215216

217+
@Test
218+
public void formLoginWhenCustomAuthenticationFailureHandlerThenUsed() {
219+
SecurityWebFilterChain securityWebFilter = this.http
220+
.authorizeExchange()
221+
.pathMatchers("/login", "/failure").permitAll()
222+
.anyExchange().authenticated()
223+
.and()
224+
.formLogin()
225+
.authenticationFailureHandler(new RedirectServerAuthenticationFailureHandler("/failure"))
226+
.and()
227+
.build();
228+
229+
WebTestClient webTestClient = WebTestClientBuilder
230+
.bindToWebFilters(securityWebFilter)
231+
.build();
232+
233+
WebDriver driver = WebTestClientHtmlUnitDriverBuilder
234+
.webTestClientSetup(webTestClient)
235+
.build();
236+
237+
DefaultLoginPage loginPage = HomePage.to(driver, DefaultLoginPage.class)
238+
.assertAt();
239+
240+
loginPage.loginForm()
241+
.username("invalid")
242+
.password("invalid")
243+
.submit(HomePage.class);
244+
245+
assertThat(driver.getCurrentUrl()).endsWith("/failure");
246+
}
247+
216248
@Test
217249
public void authenticationSuccess() {
218250
SecurityWebFilterChain securityWebFilter = this.http

0 commit comments

Comments
 (0)