From 187c76e61060b22a696d01676cb8c377e8aaa249 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Wed, 29 Jan 2020 11:47:03 -0700 Subject: [PATCH] Update Tests in oauth2webclient Sample Issue gh-7886 --- ...curity-samples-boot-oauth2webclient.gradle | 1 + .../java/sample/config/WebClientConfig.java | 8 +- .../sample/web/OAuth2WebClientController.java | 10 +- ...teredOAuth2AuthorizedClientController.java | 10 +- .../OAuth2WebClientApplicationTests.java | 2 +- .../OAuth2WebClientControllerTests.java | 109 ++++++++++++++++++ ...OAuth2AuthorizedClientControllerTests.java | 109 ++++++++++++++++++ 7 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientControllerTests.java create mode 100644 samples/boot/oauth2webclient/src/test/java/sample/RegisteredOAuth2AuthorizedClientControllerTests.java diff --git a/samples/boot/oauth2webclient/spring-security-samples-boot-oauth2webclient.gradle b/samples/boot/oauth2webclient/spring-security-samples-boot-oauth2webclient.gradle index 8aed5a0210..f65d82709c 100644 --- a/samples/boot/oauth2webclient/spring-security-samples-boot-oauth2webclient.gradle +++ b/samples/boot/oauth2webclient/spring-security-samples-boot-oauth2webclient.gradle @@ -12,4 +12,5 @@ dependencies { testCompile project(':spring-security-test') testCompile 'org.springframework.boot:spring-boot-starter-test' + testCompile 'com.squareup.okhttp3:mockwebserver' } diff --git a/samples/boot/oauth2webclient/src/main/java/sample/config/WebClientConfig.java b/samples/boot/oauth2webclient/src/main/java/sample/config/WebClientConfig.java index d98c5f7124..da9510602b 100644 --- a/samples/boot/oauth2webclient/src/main/java/sample/config/WebClientConfig.java +++ b/samples/boot/oauth2webclient/src/main/java/sample/config/WebClientConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,14 @@ package sample.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager; -import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; import org.springframework.security.oauth2.client.web.reactive.function.client.ServletOAuth2AuthorizedClientExchangeFilterFunction; import org.springframework.web.reactive.function.client.WebClient; @@ -34,12 +35,15 @@ import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { + @Value("${resource-uri}") String resourceUri; + @Bean WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) { ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 = new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager); oauth2.setDefaultOAuth2AuthorizedClient(true); return WebClient.builder() + .baseUrl(this.resourceUri) .apply(oauth2.oauth2Configuration()) .build(); } diff --git a/samples/boot/oauth2webclient/src/main/java/sample/web/OAuth2WebClientController.java b/samples/boot/oauth2webclient/src/main/java/sample/web/OAuth2WebClientController.java index 63758df1f4..226b5e9bcd 100644 --- a/samples/boot/oauth2webclient/src/main/java/sample/web/OAuth2WebClientController.java +++ b/samples/boot/oauth2webclient/src/main/java/sample/web/OAuth2WebClientController.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ */ package sample.web; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -33,18 +32,14 @@ import static org.springframework.security.oauth2.client.web.reactive.function.c public class OAuth2WebClientController { private final WebClient webClient; - private final String uri; - - public OAuth2WebClientController(WebClient webClient, @Value("${resource-uri}") String uri) { + public OAuth2WebClientController(WebClient webClient) { this.webClient = webClient; - this.uri = uri; } @GetMapping("/explicit") String explicit(Model model) { String body = this.webClient .get() - .uri(this.uri) .attributes(clientRegistrationId("client-id")) .retrieve() .bodyToMono(String.class) @@ -57,7 +52,6 @@ public class OAuth2WebClientController { String implicit(Model model) { String body = this.webClient .get() - .uri(this.uri) .retrieve() .bodyToMono(String.class) .block(); diff --git a/samples/boot/oauth2webclient/src/main/java/sample/web/RegisteredOAuth2AuthorizedClientController.java b/samples/boot/oauth2webclient/src/main/java/sample/web/RegisteredOAuth2AuthorizedClientController.java index 254fa4a5aa..b0b8200f30 100644 --- a/samples/boot/oauth2webclient/src/main/java/sample/web/RegisteredOAuth2AuthorizedClientController.java +++ b/samples/boot/oauth2webclient/src/main/java/sample/web/RegisteredOAuth2AuthorizedClientController.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,6 @@ */ package sample.web; -import org.springframework.beans.factory.annotation.Value; import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; import org.springframework.stereotype.Controller; @@ -35,18 +34,14 @@ import static org.springframework.security.oauth2.client.web.reactive.function.c public class RegisteredOAuth2AuthorizedClientController { private final WebClient webClient; - private final String uri; - - public RegisteredOAuth2AuthorizedClientController(WebClient webClient, @Value("${resource-uri}") String uri) { + public RegisteredOAuth2AuthorizedClientController(WebClient webClient) { this.webClient = webClient; - this.uri = uri; } @GetMapping("/explicit") String explicit(Model model, @RegisteredOAuth2AuthorizedClient("client-id") OAuth2AuthorizedClient authorizedClient) { String body = this.webClient .get() - .uri(this.uri) .attributes(oauth2AuthorizedClient(authorizedClient)) .retrieve() .bodyToMono(String.class) @@ -59,7 +54,6 @@ public class RegisteredOAuth2AuthorizedClientController { String implicit(Model model, @RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient) { String body = this.webClient .get() - .uri(this.uri) .attributes(oauth2AuthorizedClient(authorizedClient)) .retrieve() .bodyToMono(String.class) diff --git a/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientApplicationTests.java b/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientApplicationTests.java index 556d3992cf..4e153b9961 100644 --- a/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientApplicationTests.java +++ b/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientApplicationTests.java @@ -18,6 +18,7 @@ package sample; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -34,7 +35,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureMockMvc @RunWith(SpringRunner.class) public class OAuth2WebClientApplicationTests { - @Autowired private MockMvc mockMvc; diff --git a/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientControllerTests.java b/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientControllerTests.java new file mode 100644 index 0000000000..a22ef70e50 --- /dev/null +++ b/samples/boot/oauth2webclient/src/test/java/sample/OAuth2WebClientControllerTests.java @@ -0,0 +1,109 @@ +/* + * Copyright 2002-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sample; + +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.AfterClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import sample.config.SecurityConfig; +import sample.web.OAuth2WebClientController; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Client; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Login; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +@Import({ SecurityConfig.class, OAuth2WebClientController.class }) +@AutoConfigureMockMvc +@RunWith(SpringRunner.class) +public class OAuth2WebClientControllerTests { + private static MockWebServer web = new MockWebServer(); + + @Autowired + private MockMvc mockMvc; + + @MockBean + ClientRegistrationRepository clientRegistrationRepository; + + @AfterClass + public static void shutdown() throws Exception { + web.shutdown(); + } + + @Test + public void explicitWhenAuthenticatedThenUsesClientIdRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/webclient/explicit") + .with(oauth2Login()) + .with(oauth2Client("client-id"))) + .andExpect(status().isOk()); + } + + @Test + public void implicitWhenAuthenticatedThenUsesDefaultRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/webclient/implicit") + .with(oauth2Login())) + .andExpect(status().isOk()); + } + + @Test + public void publicExplicitWhenAuthenticatedThenUsesClientIdRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/public/webclient/explicit") + .with(oauth2Client("client-id"))) + .andExpect(status().isOk()); + } + + @Test + public void publicImplicitWhenAuthenticatedThenUsesDefaultRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/public/webclient/implicit") + .with(oauth2Login())) + .andExpect(status().isOk()); + } + + @Configuration + static class WebClientConfig { + @Bean + WebClient web() { + return WebClient.create(web.url("/").toString()); + } + + @Bean + OAuth2AuthorizedClientRepository authorizedClientRepository() { + return new HttpSessionOAuth2AuthorizedClientRepository(); + } + } +} diff --git a/samples/boot/oauth2webclient/src/test/java/sample/RegisteredOAuth2AuthorizedClientControllerTests.java b/samples/boot/oauth2webclient/src/test/java/sample/RegisteredOAuth2AuthorizedClientControllerTests.java new file mode 100644 index 0000000000..18a2ca6cd9 --- /dev/null +++ b/samples/boot/oauth2webclient/src/test/java/sample/RegisteredOAuth2AuthorizedClientControllerTests.java @@ -0,0 +1,109 @@ +/* + * Copyright 2002-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sample; + +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.AfterClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import sample.config.SecurityConfig; +import sample.web.RegisteredOAuth2AuthorizedClientController; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Client; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oauth2Login; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest +@Import({ SecurityConfig.class, RegisteredOAuth2AuthorizedClientController.class }) +@AutoConfigureMockMvc +@RunWith(SpringRunner.class) +public class RegisteredOAuth2AuthorizedClientControllerTests { + private static MockWebServer web = new MockWebServer(); + + @Autowired + private MockMvc mockMvc; + + @MockBean + ClientRegistrationRepository clientRegistrationRepository; + + @AfterClass + public static void shutdown() throws Exception { + web.shutdown(); + } + + @Test + public void annotationExplicitWhenAuthenticatedThenUsesClientIdRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/annotation/explicit") + .with(oauth2Login()) + .with(oauth2Client("client-id"))) + .andExpect(status().isOk()); + } + + @Test + public void annotationImplicitWhenAuthenticatedThenUsesDefaultRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/annotation/implicit") + .with(oauth2Login())) + .andExpect(status().isOk()); + } + + @Test + public void publicAnnotationExplicitWhenAuthenticatedThenUsesClientIdRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/public/annotation/explicit") + .with(oauth2Client("client-id"))) + .andExpect(status().isOk()); + } + + @Test + public void publicAnnotationImplicitWhenAuthenticatedThenUsesDefaultRegistration() throws Exception { + web.enqueue(new MockResponse().setBody("body").setResponseCode(200)); + this.mockMvc.perform(get("/public/annotation/implicit") + .with(oauth2Login())) + .andExpect(status().isOk()); + } + + @Configuration + static class WebClientConfig { + @Bean + WebClient web() { + return WebClient.create(web.url("/").toString()); + } + + @Bean + OAuth2AuthorizedClientRepository authorizedClientRepository() { + return new HttpSessionOAuth2AuthorizedClientRepository(); + } + } +}