|
33 | 33 | import java.util.stream.Collectors;
|
34 | 34 |
|
35 | 35 | import javax.annotation.PreDestroy;
|
| 36 | +import javax.servlet.http.HttpServletRequest; |
36 | 37 |
|
37 | 38 | import com.nimbusds.jose.JWSAlgorithm;
|
38 | 39 | import com.nimbusds.jose.JWSHeader;
|
|
108 | 109 | import org.springframework.security.oauth2.jwt.JwtTimestampValidator;
|
109 | 110 | import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
|
110 | 111 | import org.springframework.security.oauth2.jwt.TestJwts;
|
| 112 | +import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken; |
111 | 113 | import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthentication;
|
| 114 | +import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationConverter; |
112 | 115 | import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
|
113 | 116 | import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
114 | 117 | import org.springframework.security.oauth2.server.resource.authentication.JwtIssuerAuthenticationManagerResolver;
|
@@ -720,6 +723,72 @@ public void getBearerTokenResolverWhenNoResolverSpecifiedThenTheDefaultIsUsed()
|
720 | 723 | assertThat(oauth2.getBearerTokenResolver()).isInstanceOf(DefaultBearerTokenResolver.class);
|
721 | 724 | }
|
722 | 725 |
|
| 726 | + @Test |
| 727 | + public void getBearerTokenAuthenticationConverterWhenDuplicateConverterBeansAndAnotherOnTheDslThenTheDslOneIsUsed() { |
| 728 | + BearerTokenAuthenticationConverter converterBean = new BearerTokenAuthenticationConverter(); |
| 729 | + BearerTokenAuthenticationConverter converter = new BearerTokenAuthenticationConverter(); |
| 730 | + GenericWebApplicationContext context = new GenericWebApplicationContext(); |
| 731 | + context.registerBean("converterOne", BearerTokenAuthenticationConverter.class, () -> converterBean); |
| 732 | + context.registerBean("converterTwo", BearerTokenAuthenticationConverter.class, () -> converterBean); |
| 733 | + this.spring.context(context).autowire(); |
| 734 | + OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
| 735 | + oauth2.bearerTokenAuthenticationConverter(converter); |
| 736 | + assertThat(oauth2.getBearerTokenAuthenticationConverter()).isEqualTo(converter); |
| 737 | + } |
| 738 | + |
| 739 | + @Test |
| 740 | + public void getBearerTokenAuthenticationConverterWhenDuplicateConverterBeansThenWiringException() { |
| 741 | + assertThatExceptionOfType(BeanCreationException.class).isThrownBy(() -> this.spring |
| 742 | + .register(MultipleBearerTokenAuthenticationConverterBeansConfig.class, JwtDecoderConfig.class) |
| 743 | + .autowire()).withRootCauseInstanceOf(NoUniqueBeanDefinitionException.class); |
| 744 | + } |
| 745 | + |
| 746 | + @Test |
| 747 | + public void getBearerTokenAuthenticationConverterWhenConverterBeanAndAnotherOnTheDslThenTheDslOneIsUsed() { |
| 748 | + BearerTokenAuthenticationConverter converter = new BearerTokenAuthenticationConverter(); |
| 749 | + BearerTokenAuthenticationConverter converterBean = new BearerTokenAuthenticationConverter(); |
| 750 | + GenericWebApplicationContext context = new GenericWebApplicationContext(); |
| 751 | + context.registerBean(BearerTokenAuthenticationConverter.class, () -> converterBean); |
| 752 | + this.spring.context(context).autowire(); |
| 753 | + OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
| 754 | + oauth2.bearerTokenAuthenticationConverter(converter); |
| 755 | + assertThat(oauth2.getBearerTokenAuthenticationConverter()).isEqualTo(converter); |
| 756 | + } |
| 757 | + |
| 758 | + @Test |
| 759 | + public void getBearerTokenAuthenticationConverterWhenNoConverterSpecifiedThenTheDefaultIsUsed() { |
| 760 | + ApplicationContext context = this.spring.context(new GenericWebApplicationContext()).getContext(); |
| 761 | + OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
| 762 | + assertThat(oauth2.getBearerTokenAuthenticationConverter()) |
| 763 | + .isInstanceOf(BearerTokenAuthenticationConverter.class); |
| 764 | + } |
| 765 | + |
| 766 | + @Test |
| 767 | + public void getBearerTokenAuthenticationConverterWhenConverterBeanRegisteredThenBeanIsUsed() { |
| 768 | + BearerTokenAuthenticationConverter converterBean = new BearerTokenAuthenticationConverter(); |
| 769 | + GenericWebApplicationContext context = new GenericWebApplicationContext(); |
| 770 | + context.registerBean(BearerTokenAuthenticationConverter.class, () -> converterBean); |
| 771 | + this.spring.context(context).autowire(); |
| 772 | + OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
| 773 | + assertThat(oauth2.getBearerTokenAuthenticationConverter()).isEqualTo(converterBean); |
| 774 | + |
| 775 | + } |
| 776 | + |
| 777 | + @Test |
| 778 | + public void getBearerTokenAuthenticationConverterWhenOnlyResolverBeanRegisteredThenUseTheResolver() { |
| 779 | + HttpServletRequest servletRequest = mock(HttpServletRequest.class); |
| 780 | + BearerTokenResolver resolverBean = (request) -> "bearer customToken"; |
| 781 | + GenericWebApplicationContext context = new GenericWebApplicationContext(); |
| 782 | + context.registerBean(BearerTokenResolver.class, () -> resolverBean); |
| 783 | + this.spring.context(context).autowire(); |
| 784 | + OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
| 785 | + BearerTokenAuthenticationToken bearerTokenAuthenticationToken = (BearerTokenAuthenticationToken) oauth2 |
| 786 | + .getBearerTokenAuthenticationConverter().convert(servletRequest); |
| 787 | + String token = bearerTokenAuthenticationToken.getToken(); |
| 788 | + assertThat(token).isEqualTo("bearer customToken"); |
| 789 | + |
| 790 | + } |
| 791 | + |
723 | 792 | @Test
|
724 | 793 | public void requestWhenCustomJwtDecoderWiredOnDslThenUsed() throws Exception {
|
725 | 794 | this.spring.register(CustomJwtDecoderOnDsl.class, BasicController.class).autowire();
|
@@ -1871,6 +1940,32 @@ BearerTokenResolver resolverTwo() {
|
1871 | 1940 |
|
1872 | 1941 | }
|
1873 | 1942 |
|
| 1943 | + @EnableWebSecurity |
| 1944 | + static class MultipleBearerTokenAuthenticationConverterBeansConfig extends WebSecurityConfigurerAdapter { |
| 1945 | + |
| 1946 | + @Override |
| 1947 | + protected void configure(HttpSecurity http) throws Exception { |
| 1948 | + // @formatter:off |
| 1949 | + http |
| 1950 | + .oauth2ResourceServer() |
| 1951 | + .jwt(); |
| 1952 | + // @formatter:on |
| 1953 | + } |
| 1954 | + |
| 1955 | + @Bean |
| 1956 | + BearerTokenAuthenticationConverter converterOne() { |
| 1957 | + BearerTokenAuthenticationConverter converter = new BearerTokenAuthenticationConverter(); |
| 1958 | + return converter; |
| 1959 | + } |
| 1960 | + |
| 1961 | + @Bean |
| 1962 | + BearerTokenAuthenticationConverter converterTwo() { |
| 1963 | + BearerTokenAuthenticationConverter converter = new BearerTokenAuthenticationConverter(); |
| 1964 | + return converter; |
| 1965 | + } |
| 1966 | + |
| 1967 | + } |
| 1968 | + |
1874 | 1969 | @EnableWebSecurity
|
1875 | 1970 | static class CustomJwtDecoderOnDsl extends WebSecurityConfigurerAdapter {
|
1876 | 1971 |
|
|
0 commit comments