mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-03-01 10:59:16 +00:00
Add Support OAuth2AuthorizationRequestResolver As Bean
Closes gh-16380 Signed-off-by: Max Batischev <mblancer@mail.ru>
This commit is contained in:
parent
72a2831f76
commit
bf9b95a481
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2024 the original author or authors.
|
* Copyright 2002-2025 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -68,6 +68,7 @@ import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
|
|||||||
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
|
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
|
||||||
import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository;
|
import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository;
|
||||||
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
|
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
|
||||||
|
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver;
|
||||||
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
|
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
|
||||||
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
|
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
|
||||||
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
|
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
|
||||||
@ -396,20 +397,8 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void configure(B http) throws Exception {
|
public void configure(B http) throws Exception {
|
||||||
OAuth2AuthorizationRequestRedirectFilter authorizationRequestFilter;
|
OAuth2AuthorizationRequestRedirectFilter authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
|
||||||
if (this.authorizationEndpointConfig.authorizationRequestResolver != null) {
|
getAuthorizationRequestResolver());
|
||||||
authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
|
|
||||||
this.authorizationEndpointConfig.authorizationRequestResolver);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
String authorizationRequestBaseUri = this.authorizationEndpointConfig.authorizationRequestBaseUri;
|
|
||||||
if (authorizationRequestBaseUri == null) {
|
|
||||||
authorizationRequestBaseUri = OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
|
|
||||||
}
|
|
||||||
authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
|
|
||||||
OAuth2ClientConfigurerUtils.getClientRegistrationRepository(this.getBuilder()),
|
|
||||||
authorizationRequestBaseUri);
|
|
||||||
}
|
|
||||||
if (this.authorizationEndpointConfig.authorizationRequestRepository != null) {
|
if (this.authorizationEndpointConfig.authorizationRequestRepository != null) {
|
||||||
authorizationRequestFilter
|
authorizationRequestFilter
|
||||||
.setAuthorizationRequestRepository(this.authorizationEndpointConfig.authorizationRequestRepository);
|
.setAuthorizationRequestRepository(this.authorizationEndpointConfig.authorizationRequestRepository);
|
||||||
@ -440,6 +429,24 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>>
|
|||||||
return new AntPathRequestMatcher(loginProcessingUrl);
|
return new AntPathRequestMatcher(loginProcessingUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OAuth2AuthorizationRequestResolver getAuthorizationRequestResolver() {
|
||||||
|
if (this.authorizationEndpointConfig.authorizationRequestResolver != null) {
|
||||||
|
return this.authorizationEndpointConfig.authorizationRequestResolver;
|
||||||
|
}
|
||||||
|
ClientRegistrationRepository clientRegistrationRepository = OAuth2ClientConfigurerUtils
|
||||||
|
.getClientRegistrationRepository(getBuilder());
|
||||||
|
ResolvableType resolvableType = ResolvableType.forClass(OAuth2AuthorizationRequestResolver.class);
|
||||||
|
OAuth2AuthorizationRequestResolver bean = getBeanOrNull(resolvableType);
|
||||||
|
if (bean != null) {
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
String authorizationRequestBaseUri = this.authorizationEndpointConfig.authorizationRequestBaseUri;
|
||||||
|
if (authorizationRequestBaseUri == null) {
|
||||||
|
authorizationRequestBaseUri = OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
|
||||||
|
}
|
||||||
|
return new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, authorizationRequestBaseUri);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private JwtDecoderFactory<ClientRegistration> getJwtDecoderFactoryBean() {
|
private JwtDecoderFactory<ClientRegistration> getJwtDecoderFactoryBean() {
|
||||||
ResolvableType type = ResolvableType.forClassWithGenerics(JwtDecoderFactory.class, ClientRegistration.class);
|
ResolvableType type = ResolvableType.forClassWithGenerics(JwtDecoderFactory.class, ClientRegistration.class);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2002-2024 the original author or authors.
|
* Copyright 2002-2025 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -379,6 +379,19 @@ public class OAuth2LoginConfigurerTests {
|
|||||||
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1");
|
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void oauth2LoginWithCustomAuthorizationRequestParametersAndResolverAsBean() throws Exception {
|
||||||
|
loadConfig(OAuth2LoginConfigCustomAuthorizationRequestResolverBean.class);
|
||||||
|
// @formatter:off
|
||||||
|
// @formatter:on
|
||||||
|
String requestUri = "/oauth2/authorization/google";
|
||||||
|
this.request = new MockHttpServletRequest("GET", requestUri);
|
||||||
|
this.request.setServletPath(requestUri);
|
||||||
|
this.springSecurityFilterChain.doFilter(this.request, this.response, this.filterChain);
|
||||||
|
assertThat(this.response.getRedirectedUrl()).isEqualTo(
|
||||||
|
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void requestWhenOauth2LoginWithCustomAuthorizationRequestParametersThenParametersInRedirectedUrl()
|
public void requestWhenOauth2LoginWithCustomAuthorizationRequestParametersThenParametersInRedirectedUrl()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
@ -940,6 +953,42 @@ public class OAuth2LoginConfigurerTests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableWebSecurity
|
||||||
|
static class OAuth2LoginConfigCustomAuthorizationRequestResolverBean extends CommonSecurityFilterChainConfig {
|
||||||
|
|
||||||
|
private ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
|
||||||
|
GOOGLE_CLIENT_REGISTRATION);
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||||
|
// @formatter:off
|
||||||
|
http
|
||||||
|
.oauth2Login()
|
||||||
|
.clientRegistrationRepository(this.clientRegistrationRepository)
|
||||||
|
.authorizationEndpoint();
|
||||||
|
// @formatter:on
|
||||||
|
return super.configureFilterChain(http);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
OAuth2AuthorizationRequestResolver resolver() {
|
||||||
|
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
|
||||||
|
// @formatter:off
|
||||||
|
OAuth2AuthorizationRequest result = OAuth2AuthorizationRequest.authorizationCode()
|
||||||
|
.authorizationUri("https://accounts.google.com/authorize")
|
||||||
|
.clientId("client-id")
|
||||||
|
.state("adsfa")
|
||||||
|
.authorizationRequestUri(
|
||||||
|
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1")
|
||||||
|
.build();
|
||||||
|
given(resolver.resolve(any())).willReturn(result);
|
||||||
|
// @formatter:on
|
||||||
|
return resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
static class OAuth2LoginConfigCustomAuthorizationRequestResolverInLambda
|
static class OAuth2LoginConfigCustomAuthorizationRequestResolverInLambda
|
||||||
|
Loading…
x
Reference in New Issue
Block a user