diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfiguration.java index 8ece42f643..da35e800b3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfiguration.java @@ -25,6 +25,8 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; /** * {@link WebSecurityConfigurerAdapter} to add OAuth client support. @@ -44,6 +46,13 @@ class OAuth2WebSecurityConfiguration { return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository); } + @Bean + @ConditionalOnMissingBean + public OAuth2AuthorizedClientRepository authorizedClientRepository( + OAuth2AuthorizedClientService authorizedClientService) { + return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService); + } + @Configuration @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) static class OAuth2WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfigurationTests.java index 36990dcb8b..44a9e4cb0e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfigurationTests.java @@ -24,6 +24,7 @@ import javax.servlet.Filter; import org.junit.Test; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; @@ -38,7 +39,9 @@ import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository; import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository; import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.web.FilterChainProxy; @@ -90,6 +93,19 @@ public class OAuth2WebSecurityConfigurationTests { }); } + @Test + public void configurationRegistersAuthorizedRepositoryServiceBean() { + this.contextRunner.withUserConfiguration(ClientRepositoryConfiguration.class, + OAuth2WebSecurityConfiguration.class).run((context) -> { + OAuth2AuthorizedClientRepository bean = context + .getBean(OAuth2AuthorizedClientRepository.class); + OAuth2AuthorizedClientRepository authorizedClientService = (OAuth2AuthorizedClientRepository) ReflectionTestUtils + .getField(getAuthCodeFilters(context).get(0), + "authorizedClientRepository"); + assertThat(authorizedClientService).isEqualTo(bean); + }); + } + @Test public void securityConfigurerBacksOffWhenOtherWebSecurityAdapterPresent() { this.contextRunner.withUserConfiguration(TestWebSecurityConfigurerConfig.class, @@ -112,6 +128,21 @@ public class OAuth2WebSecurityConfigurationTests { }); } + @Test + public void authorizedClientRepositoryBeanIsConditionalOnMissingBean() { + this.contextRunner + .withUserConfiguration(OAuth2AuthorizedClientServiceConfiguration.class, + OAuth2WebSecurityConfiguration.class) + .run((context) -> { + OAuth2AuthorizedClientRepository bean = context + .getBean(OAuth2AuthorizedClientRepository.class); + OAuth2AuthorizedClientRepository authorizedClientService = (OAuth2AuthorizedClientRepository) ReflectionTestUtils + .getField(getAuthCodeFilters(context).get(0), + "authorizedClientRepository"); + assertThat(authorizedClientService).isEqualTo(bean); + }); + } + @SuppressWarnings("unchecked") private List getAuthCodeFilters(AssertableApplicationContext context) { FilterChainProxy filterChain = (FilterChainProxy) context @@ -210,6 +241,13 @@ public class OAuth2WebSecurityConfigurationTests { clientRegistrationRepository); } + @Bean + @ConditionalOnMissingBean + public OAuth2AuthorizedClientRepository testAuthorizedClientRepository( + OAuth2AuthorizedClientService authorizedClientService) { + return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService); + } + } }