Skip to content

Commit e5dab23

Browse files
etwillbefinejgrandja
authored andcommitted
Make RedirectResolver configurable for AuthorizationEndpoint
Fixes spring-atticgh-1190
1 parent 3148a7d commit e5dab23

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configuration/AuthorizationServerEndpointsConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint;
4545
import org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint;
4646
import org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping;
47+
import org.springframework.security.oauth2.provider.endpoint.RedirectResolver;
4748
import org.springframework.security.oauth2.provider.endpoint.TokenEndpoint;
4849
import org.springframework.security.oauth2.provider.endpoint.TokenKeyEndpoint;
4950
import org.springframework.security.oauth2.provider.endpoint.WhitelabelApprovalEndpoint;
@@ -95,6 +96,7 @@ public AuthorizationEndpoint authorizationEndpoint() throws Exception {
9596
authorizationEndpoint.setOAuth2RequestFactory(oauth2RequestFactory());
9697
authorizationEndpoint.setOAuth2RequestValidator(oauth2RequestValidator());
9798
authorizationEndpoint.setUserApprovalHandler(userApprovalHandler());
99+
authorizationEndpoint.setRedirectResolver(redirectResolver());
98100
return authorizationEndpoint;
99101
}
100102

@@ -200,6 +202,10 @@ private WebResponseExceptionTranslator exceptionTranslator() {
200202
return getEndpointsConfigurer().getExceptionTranslator();
201203
}
202204

205+
private RedirectResolver redirectResolver() {
206+
return getEndpointsConfigurer().getRedirectResolver();
207+
}
208+
203209
private TokenGranter tokenGranter() throws Exception {
204210
return getEndpointsConfigurer().getTokenGranter();
205211
}

spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configurers/AuthorizationServerEndpointsConfigurer.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@
5252
import org.springframework.security.oauth2.provider.code.AuthorizationCodeServices;
5353
import org.springframework.security.oauth2.provider.code.AuthorizationCodeTokenGranter;
5454
import org.springframework.security.oauth2.provider.code.InMemoryAuthorizationCodeServices;
55+
import org.springframework.security.oauth2.provider.endpoint.DefaultRedirectResolver;
5556
import org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping;
57+
import org.springframework.security.oauth2.provider.endpoint.RedirectResolver;
5658
import org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator;
5759
import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;
5860
import org.springframework.security.oauth2.provider.implicit.ImplicitTokenGranter;
@@ -137,6 +139,8 @@ public final class AuthorizationServerEndpointsConfigurer {
137139

138140
private WebResponseExceptionTranslator exceptionTranslator;
139141

142+
private RedirectResolver redirectResolver;
143+
140144
public AuthorizationServerTokenServices getTokenServices() {
141145
return ProxyCreator.getProxy(AuthorizationServerTokenServices.class,
142146
new ObjectFactory<AuthorizationServerTokenServices>() {
@@ -217,6 +221,11 @@ public AuthorizationServerEndpointsConfigurer tokenServices(AuthorizationServerT
217221
return this;
218222
}
219223

224+
public AuthorizationServerEndpointsConfigurer redirectResolver(RedirectResolver redirectResolver) {
225+
this.redirectResolver = redirectResolver;
226+
return this;
227+
}
228+
220229
public boolean isTokenServicesOverride() {
221230
return tokenServicesOverride;
222231
}
@@ -360,6 +369,10 @@ public WebResponseExceptionTranslator getExceptionTranslator() {
360369
return exceptionTranslator();
361370
}
362371

372+
public RedirectResolver getRedirectResolver() {
373+
return redirectResolver();
374+
}
375+
363376
private ResourceServerTokenServices resourceTokenServices() {
364377
if (resourceTokenServices == null) {
365378
if (tokenServices instanceof ResourceServerTokenServices) {
@@ -512,6 +525,14 @@ private WebResponseExceptionTranslator exceptionTranslator() {
512525
return exceptionTranslator;
513526
}
514527

528+
private RedirectResolver redirectResolver() {
529+
if (redirectResolver != null) {
530+
return redirectResolver;
531+
}
532+
redirectResolver = new DefaultRedirectResolver();
533+
return redirectResolver;
534+
}
535+
515536
private OAuth2RequestFactory requestFactory() {
516537
if (requestFactory != null) {
517538
return requestFactory;

spring-security-oauth2/src/test/java/org/springframework/security/oauth2/config/annotation/AuthorizationServerConfigurationTests.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,14 @@
3737
import org.springframework.security.core.userdetails.UsernameNotFoundException;
3838
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
3939
import org.springframework.security.jwt.crypto.sign.MacSigner;
40+
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
4041
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
4142
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
4243
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
4344
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
4445
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
4546
import org.springframework.security.oauth2.provider.AuthorizationRequest;
47+
import org.springframework.security.oauth2.provider.ClientDetails;
4648
import org.springframework.security.oauth2.provider.ClientDetailsService;
4749
import org.springframework.security.oauth2.provider.OAuth2RequestFactory;
4850
import org.springframework.security.oauth2.provider.approval.DefaultUserApprovalHandler;
@@ -52,6 +54,7 @@
5254
import org.springframework.security.oauth2.provider.client.InMemoryClientDetailsService;
5355
import org.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint;
5456
import org.springframework.security.oauth2.provider.endpoint.CheckTokenEndpoint;
57+
import org.springframework.security.oauth2.provider.endpoint.RedirectResolver;
5558
import org.springframework.security.oauth2.provider.endpoint.TokenEndpoint;
5659
import org.springframework.security.oauth2.provider.error.DefaultWebResponseExceptionTranslator;
5760
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
@@ -107,7 +110,9 @@ public static List<Object[]> parameters() {
107110
new Object[] { null, new Class<?>[] { AuthorizationServerAllowsOnlyPost.class } },
108111
new Object[] { BeanCreationException.class, new Class<?>[] { AuthorizationServerTypes.class } },
109112
new Object[] { null, new Class<?>[] { AuthorizationServerCustomGranter.class } },
110-
new Object[] { null, new Class<?>[] { AuthorizationServerSslEnabled.class } }
113+
new Object[] { null, new Class<?>[] { AuthorizationServerSslEnabled.class } },
114+
new Object[] { null, new Class<?>[] { AuthorizationServerCustomRedirectResolver.class } },
115+
new Object[] { null, new Class<?>[] { AuthorizationServerDefaultRedirectResolver.class } }
111116
// @formatter:on
112117
);
113118
}
@@ -545,6 +550,51 @@ public void run() {
545550

546551
}
547552

553+
@EnableWebSecurity
554+
@EnableAuthorizationServer
555+
protected static class AuthorizationServerCustomRedirectResolver extends AuthorizationServerConfigurerAdapter
556+
implements Runnable {
557+
558+
@Autowired
559+
private ApplicationContext context;
560+
561+
@Override
562+
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
563+
endpoints.redirectResolver(new CustomRedirectResolver());
564+
}
565+
566+
@Override
567+
public void run() {
568+
RedirectResolver resolver = (RedirectResolver) ReflectionTestUtils.getField(context.getBean(AuthorizationEndpoint.class), "redirectResolver");
569+
570+
assertNotNull(resolver);
571+
assertTrue(resolver instanceof CustomRedirectResolver);
572+
}
573+
574+
static class CustomRedirectResolver implements RedirectResolver {
575+
@Override
576+
public String resolveRedirect(final String requestedRedirect, final ClientDetails client) throws OAuth2Exception {
577+
return "go/here";
578+
}
579+
}
580+
}
581+
582+
@EnableWebSecurity
583+
@EnableAuthorizationServer
584+
protected static class AuthorizationServerDefaultRedirectResolver extends AuthorizationServerConfigurerAdapter
585+
implements Runnable {
586+
587+
@Autowired
588+
private ApplicationContext context;
589+
590+
@Override
591+
public void run() {
592+
assertNotNull(
593+
ReflectionTestUtils.getField(context.getBean(AuthorizationEndpoint.class), "redirectResolver"));
594+
}
595+
596+
}
597+
548598
@Configuration
549599
@EnableWebMvcSecurity
550600
@EnableAuthorizationServer

0 commit comments

Comments
 (0)