Add loginPage() to DSL in reactive oauth2Login()

Closes gh-15674
This commit is contained in:
Steve Riesenberg
2024-09-11 15:53:35 -05:00
parent 9e5cc5f267
commit 51c226f24c
4 changed files with 170 additions and 20 deletions

View File

@@ -31,6 +31,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.ReactiveAuthenticationManager;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.authentication.UserDetailsRepositoryReactiveAuthenticationManager;
@@ -257,6 +258,65 @@ public class OAuth2LoginTests {
// @formatter:on
}
@Test
public void defaultLoginPageWhenCustomLoginPageThenGeneratedLoginPageDoesNotExist() {
this.spring
.register(OAuth2LoginWithSingleClientRegistrations.class, OAuth2LoginWithCustomLoginPage.class,
WebFluxConfig.class)
.autowire();
// @formatter:off
this.client.get()
.uri("/login")
.exchange()
.expectStatus().isNotFound();
// @formatter:on
}
@Test
public void oauth2LoginWhenCustomLoginPageAndSingleClientRegistrationThenRedirectsToLoginPage() {
this.spring
.register(OAuth2LoginWithSingleClientRegistrations.class, OAuth2LoginWithCustomLoginPage.class,
WebFluxConfig.class)
.autowire();
// @formatter:off
this.client.get()
.uri("/")
.exchange()
.expectStatus().is3xxRedirection()
.expectHeader().valueEquals(HttpHeaders.LOCATION, "/login");
// @formatter:on
}
@Test
public void oauth2LoginWhenCustomLoginPageAndMultipleClientRegistrationsThenRedirectsToLoginPage() {
this.spring
.register(OAuth2LoginWithMultipleClientRegistrations.class, OAuth2LoginWithCustomLoginPage.class,
WebFluxConfig.class)
.autowire();
// @formatter:off
this.client.get()
.uri("/")
.exchange()
.expectStatus().is3xxRedirection()
.expectHeader().valueEquals(HttpHeaders.LOCATION, "/login");
// @formatter:on
}
@Test
public void oauth2LoginWhenProviderLoginPageAndMultipleClientRegistrationsThenRedirectsToProvider() {
this.spring
.register(OAuth2LoginWithMultipleClientRegistrations.class, OAuth2LoginWithProviderLoginPage.class,
WebFluxConfig.class)
.autowire();
// @formatter:off
this.client.get()
.uri("/")
.exchange()
.expectStatus().is3xxRedirection()
.expectHeader().valueEquals(HttpHeaders.LOCATION, "/oauth2/authorization/github");
// @formatter:on
}
@Test
public void oauth2AuthorizeWhenCustomObjectsThenUsed() {
this.spring
@@ -756,6 +816,46 @@ public class OAuth2LoginTests {
}
@Configuration
@EnableWebFluxSecurity
static class OAuth2LoginWithCustomLoginPage {
@Bean
SecurityWebFilterChain filterChain(ServerHttpSecurity http) {
// @formatter:off
http
.authorizeExchange((authorize) -> authorize
.pathMatchers(HttpMethod.GET, "/login").permitAll()
.anyExchange().authenticated()
)
.oauth2Login((oauth2) -> oauth2
.loginPage("/login")
);
// @formatter:on
return http.build();
}
}
@Configuration
@EnableWebFluxSecurity
static class OAuth2LoginWithProviderLoginPage {
@Bean
SecurityWebFilterChain filterChain(ServerHttpSecurity http) {
// @formatter:off
http.authorizeExchange((authorize) -> authorize
.anyExchange().authenticated()
)
.oauth2Login((oauth2) -> oauth2
.loginPage("/oauth2/authorization/github")
);
// @formatter:on
return http.build();
}
}
@Configuration
static class OAuth2LoginMockAuthenticationManagerConfig {