diff --git a/config/src/test/java/org/springframework/security/config/web/server/OAuth2LoginTests.java b/config/src/test/java/org/springframework/security/config/web/server/OAuth2LoginTests.java index 211d353203e..329c7d4e0bf 100644 --- a/config/src/test/java/org/springframework/security/config/web/server/OAuth2LoginTests.java +++ b/config/src/test/java/org/springframework/security/config/web/server/OAuth2LoginTests.java @@ -23,6 +23,7 @@ import org.junit.Rule; import org.junit.Test; import org.mockito.stubbing.Answer; +import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import reactor.core.publisher.Mono; @@ -33,14 +34,17 @@ import org.springframework.http.HttpHeaders; import org.springframework.security.authentication.ReactiveAuthenticationManager; import org.springframework.security.authentication.TestingAuthenticationToken; +import org.springframework.security.authentication.UserDetailsRepositoryReactiveAuthenticationManager; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; import org.springframework.security.config.test.SpringTestRule; +import org.springframework.security.config.users.ReactiveAuthenticationTestConfiguration; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextImpl; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.security.htmlunit.server.WebTestClientHtmlUnitDriverBuilder; import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; @@ -176,6 +180,25 @@ public void defaultLoginPageWithSingleClientRegistrationThenRedirect() { assertThat(driver.getCurrentUrl()).startsWith("https://github.com/login/oauth/authorize"); } + @Test + public void formLoginWithSingleClientRegistrationThenRedirect() { + this.spring.register(OAuth2LoginWithSingleClientRegistrations.class, OAuth2LoginWithFormLogin.class).autowire(); + // @formatter:off + WebTestClient webTestClient = WebTestClientBuilder + .bindToWebFilters(new GitHubWebFilter(), this.springSecurity) + .build(); + WebDriver driver = WebTestClientHtmlUnitDriverBuilder + .webTestClientSetup(webTestClient) + .build(); + // @formatter:on + driver.get("http://localhost/"); + assertThat(driver.getCurrentUrl()).isEqualTo("http://localhost/login"); + assertThat(driver.findElement(By.xpath("//form[contains(@action,'/login')]/h2")).getText()) + .isEqualTo("Please sign in"); + assertThat(driver.findElement(By.xpath("//div[contains(@class, 'container')]/h2")).getText()) + .isEqualTo("Login with OAuth 2.0"); + } + // gh-8118 @Test public void defaultLoginPageWithSingleClientRegistrationAndXhrRequestThenDoesNotRedirectForAuthorization() { @@ -584,6 +607,30 @@ String home(@RegisteredOAuth2AuthorizedClient("github") OAuth2AuthorizedClient a } + @Configuration + static class OAuth2LoginWithFormLogin { + + @Bean + SecurityWebFilterChain springSecurityFilter(ServerHttpSecurity http) { + ReactiveUserDetailsService reactiveUserDetailsService = ReactiveAuthenticationTestConfiguration + .userDetailsService(); + ReactiveAuthenticationManager authenticationManager = new UserDetailsRepositoryReactiveAuthenticationManager( + reactiveUserDetailsService); + http.authenticationManager(authenticationManager); + // @formatter:off + http + .authorizeExchange() + .anyExchange().authenticated() + .and() + .oauth2Login() + .and() + .formLogin(); + // @formatter:on + return http.build(); + } + + } + @Configuration static class OAuth2LoginMockAuthenticationManagerConfig {