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..ffd1f484b7 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,14 @@ 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..20621acd90 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 @@ -38,7 +38,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 +92,15 @@ public class OAuth2WebSecurityConfigurationTests { }); } + @Test + public void configurationRegistersAuthorizedClientRepositoryBean() { + this.contextRunner + .withUserConfiguration(ClientRepositoryConfiguration.class, + OAuth2WebSecurityConfiguration.class) + .run((context) -> assertThat(context) + .hasSingleBean(OAuth2AuthorizedClientRepository.class)); + } + @Test public void securityConfigurerBacksOffWhenOtherWebSecurityAdapterPresent() { this.contextRunner.withUserConfiguration(TestWebSecurityConfigurerConfig.class, @@ -112,6 +123,17 @@ public class OAuth2WebSecurityConfigurationTests { }); } + @Test + public void authorizedClientRepositoryBeanIsConditionalOnMissingBean() { + this.contextRunner.withUserConfiguration( + OAuth2AuthorizedClientRepositoryConfiguration.class, + OAuth2WebSecurityConfiguration.class).run((context) -> { + assertThat(context) + .hasSingleBean(OAuth2AuthorizedClientRepository.class); + assertThat(context).hasBean("testAuthorizedClientRepository"); + }); + } + @SuppressWarnings("unchecked") private List getAuthCodeFilters(AssertableApplicationContext context) { FilterChainProxy filterChain = (FilterChainProxy) context @@ -212,4 +234,17 @@ public class OAuth2WebSecurityConfigurationTests { } + @Configuration + @Import(ClientRepositoryConfiguration.class) + static class OAuth2AuthorizedClientRepositoryConfiguration { + + @Bean + public OAuth2AuthorizedClientRepository testAuthorizedClientRepository( + OAuth2AuthorizedClientService authorizedClientService) { + return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository( + authorizedClientService); + } + + } + }