|
15 | 15 | */
|
16 | 16 | package org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers;
|
17 | 17 |
|
| 18 | +import static org.assertj.core.api.Assertions.assertThat; |
| 19 | +import static org.hamcrest.CoreMatchers.containsString; |
| 20 | +import static org.mockito.ArgumentMatchers.any; |
| 21 | +import static org.mockito.BDDMockito.given; |
| 22 | +import static org.mockito.BDDMockito.willAnswer; |
| 23 | +import static org.mockito.Mockito.mock; |
| 24 | +import static org.mockito.Mockito.reset; |
| 25 | +import static org.mockito.Mockito.verify; |
| 26 | +import static org.mockito.Mockito.verifyNoInteractions; |
| 27 | +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; |
| 28 | +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; |
| 29 | +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
| 30 | +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; |
| 31 | +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; |
| 32 | +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; |
| 33 | +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
| 34 | + |
| 35 | +import com.nimbusds.jose.jwk.JWKSet; |
| 36 | +import com.nimbusds.jose.jwk.source.JWKSource; |
| 37 | +import com.nimbusds.jose.proc.SecurityContext; |
| 38 | +import jakarta.servlet.http.HttpServletResponse; |
18 | 39 | import java.time.Duration;
|
19 | 40 | import java.time.Instant;
|
20 | 41 | import java.time.temporal.ChronoUnit;
|
|
23 | 44 | import java.util.List;
|
24 | 45 | import java.util.Map;
|
25 | 46 | import java.util.function.Consumer;
|
26 |
| - |
27 | 47 | import javax.crypto.spec.SecretKeySpec;
|
28 |
| - |
29 |
| -import com.nimbusds.jose.jwk.JWKSet; |
30 |
| -import com.nimbusds.jose.jwk.source.JWKSource; |
31 |
| -import com.nimbusds.jose.proc.SecurityContext; |
32 |
| -import jakarta.servlet.http.HttpServletResponse; |
33 | 48 | import okhttp3.mockwebserver.MockResponse;
|
34 | 49 | import okhttp3.mockwebserver.MockWebServer;
|
35 | 50 | import org.assertj.core.data.TemporalUnitWithinOffset;
|
|
40 | 55 | import org.junit.jupiter.api.Test;
|
41 | 56 | import org.junit.jupiter.api.extension.ExtendWith;
|
42 | 57 | import org.mockito.ArgumentCaptor;
|
43 |
| - |
44 | 58 | import org.springframework.beans.factory.annotation.Autowired;
|
45 | 59 | import org.springframework.context.annotation.Bean;
|
46 | 60 | import org.springframework.context.annotation.Configuration;
|
|
111 | 125 | import org.springframework.util.CollectionUtils;
|
112 | 126 | import org.springframework.web.util.UriComponentsBuilder;
|
113 | 127 |
|
114 |
| -import static org.assertj.core.api.Assertions.assertThat; |
115 |
| -import static org.hamcrest.CoreMatchers.containsString; |
116 |
| -import static org.mockito.ArgumentMatchers.any; |
117 |
| -import static org.mockito.BDDMockito.given; |
118 |
| -import static org.mockito.BDDMockito.willAnswer; |
119 |
| -import static org.mockito.Mockito.mock; |
120 |
| -import static org.mockito.Mockito.reset; |
121 |
| -import static org.mockito.Mockito.verify; |
122 |
| -import static org.mockito.Mockito.verifyNoInteractions; |
123 |
| -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; |
124 |
| -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; |
125 |
| -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
126 |
| -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; |
127 |
| -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; |
128 |
| -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; |
129 |
| -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
130 |
| - |
131 | 128 | /**
|
132 | 129 | * Integration tests for OpenID Connect Dynamic Client Registration 1.0.
|
133 | 130 | *
|
@@ -531,8 +528,8 @@ public void requestWhenClientRegistersWithSecretExpirationThenClientRegistration
|
531 | 528 |
|
532 | 529 | OidcClientRegistration clientRegistrationResponse = registerClient(clientRegistration);
|
533 | 530 |
|
534 |
| - var expectedSecretExpiryDate = Instant.now().plus(Duration.ofHours(24)); |
535 |
| - var allowedDelta = new TemporalUnitWithinOffset(1, ChronoUnit.MINUTES); |
| 531 | + Instant expectedSecretExpiryDate = Instant.now().plus(Duration.ofHours(24)); |
| 532 | + TemporalUnitWithinOffset allowedDelta = new TemporalUnitWithinOffset(1, ChronoUnit.MINUTES); |
536 | 533 |
|
537 | 534 | // Returned response contains expiration date
|
538 | 535 | assertThat(clientRegistrationResponse.getClientSecretExpiresAt())
|
@@ -685,40 +682,52 @@ public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity h
|
685 | 682 |
|
686 | 683 | @EnableWebSecurity
|
687 | 684 | @Configuration(proxyBeanMethods = false)
|
688 |
| - static class CustomClientMetadataConfiguration extends ClientRegistrationConvertersConfiguration { |
689 |
| - |
690 |
| - private static final List<String> supportedCustomClientMetadata = List.of("custom-metadata-name-1", "custom-metadata-name-2"); |
| 685 | + static class CustomClientMetadataConfiguration extends AuthorizationServerConfiguration { |
691 | 686 |
|
| 687 | + // @formatter:off |
| 688 | + @Bean |
692 | 689 | @Override
|
693 |
| - protected Converter<OidcClientRegistration, RegisteredClient> registeredClientConverter() { |
694 |
| - return new CustomRegisteredClientConverter(supportedCustomClientMetadata); |
| 690 | + public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { |
| 691 | + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = |
| 692 | + OAuth2AuthorizationServerConfigurer.authorizationServer(); |
| 693 | + http |
| 694 | + .securityMatcher(authorizationServerConfigurer.getEndpointsMatcher()) |
| 695 | + .with(authorizationServerConfigurer, (authorizationServer) -> |
| 696 | + authorizationServer |
| 697 | + .oidc((oidc) -> |
| 698 | + oidc |
| 699 | + .clientRegistrationEndpoint((clientRegistration) -> |
| 700 | + clientRegistration |
| 701 | + .authenticationProviders(configureClientRegistrationConverters()) |
| 702 | + ) |
| 703 | + ) |
| 704 | + ) |
| 705 | + .authorizeHttpRequests((authorize) -> |
| 706 | + authorize.anyRequest().authenticated() |
| 707 | + ); |
| 708 | + return http.build(); |
695 | 709 | }
|
| 710 | + // @formatter:on |
696 | 711 |
|
697 |
| - @Override |
698 |
| - protected Converter<RegisteredClient, OidcClientRegistration> oidcClientRegistrationConverter() { |
699 |
| - return new CustomClientRegistrationConverter(supportedCustomClientMetadata); |
| 712 | + private Consumer<List<AuthenticationProvider>> configureClientRegistrationConverters() { |
| 713 | + // @formatter:off |
| 714 | + return (authenticationProviders) -> |
| 715 | + authenticationProviders.forEach((authenticationProvider) -> { |
| 716 | + List<String> supportedCustomClientMetadata = List.of("custom-metadata-name-1", "custom-metadata-name-2"); |
| 717 | + if (authenticationProvider instanceof OidcClientRegistrationAuthenticationProvider provider) { |
| 718 | + provider.setRegisteredClientConverter(new CustomRegisteredClientConverter(supportedCustomClientMetadata)); |
| 719 | + provider.setClientRegistrationConverter(new CustomClientRegistrationConverter(supportedCustomClientMetadata)); |
| 720 | + } |
| 721 | + }); |
| 722 | + // @formatter:on |
700 | 723 | }
|
701 | 724 |
|
702 | 725 | }
|
703 | 726 |
|
704 | 727 | @EnableWebSecurity
|
705 | 728 | @Configuration(proxyBeanMethods = false)
|
706 |
| - static class ClientSecretExpirationConfiguration extends ClientRegistrationConvertersConfiguration { |
707 |
| - |
708 |
| - @Override |
709 |
| - protected Converter<OidcClientRegistration, RegisteredClient> registeredClientConverter() { |
710 |
| - return new ClientSecretExpirationRegisteredClientConverter(); |
711 |
| - } |
| 729 | + static class ClientSecretExpirationConfiguration extends AuthorizationServerConfiguration { |
712 | 730 |
|
713 |
| - } |
714 |
| - |
715 |
| - /** |
716 |
| - * This test configuration allows to override {@code RegisteredClient} -> {@code OidcClientRegistration} and |
717 |
| - * {@code OidcClientRegistration} -> {@code RegisteredClient} converters |
718 |
| - */ |
719 |
| - @EnableWebSecurity |
720 |
| - @Configuration(proxyBeanMethods = false) |
721 |
| - static class ClientRegistrationConvertersConfiguration extends AuthorizationServerConfiguration { |
722 | 731 | // @formatter:off
|
723 | 732 | @Bean
|
724 | 733 | @Override
|
@@ -749,26 +758,12 @@ private Consumer<List<AuthenticationProvider>> configureClientRegistrationConver
|
749 | 758 | return (authenticationProviders) ->
|
750 | 759 | authenticationProviders.forEach((authenticationProvider) -> {
|
751 | 760 | if (authenticationProvider instanceof OidcClientRegistrationAuthenticationProvider provider) {
|
752 |
| - var registeredClientConverter = registeredClientConverter(); |
753 |
| - if (registeredClientConverter != null) { |
754 |
| - provider.setRegisteredClientConverter(registeredClientConverter); |
755 |
| - } |
756 |
| - var oidcClientRegistrationConverter = oidcClientRegistrationConverter(); |
757 |
| - if (oidcClientRegistrationConverter != null) { |
758 |
| - provider.setClientRegistrationConverter(oidcClientRegistrationConverter); |
759 |
| - } |
| 761 | + provider.setRegisteredClientConverter(new ClientSecretExpirationRegisteredClientConverter()); |
760 | 762 | }
|
761 | 763 | });
|
762 | 764 | // @formatter:on
|
763 | 765 | }
|
764 | 766 |
|
765 |
| - protected Converter<OidcClientRegistration, RegisteredClient> registeredClientConverter() { |
766 |
| - return null; |
767 |
| - } |
768 |
| - |
769 |
| - protected Converter<RegisteredClient, OidcClientRegistration> oidcClientRegistrationConverter() { |
770 |
| - return null; |
771 |
| - } |
772 | 767 | }
|
773 | 768 |
|
774 | 769 | @EnableWebSecurity
|
@@ -921,5 +916,4 @@ public RegisteredClient convert(OidcClientRegistration clientRegistration) {
|
921 | 916 | return registeredClientBuilder.build();
|
922 | 917 | }
|
923 | 918 | }
|
924 |
| - |
925 | 919 | }
|
0 commit comments