|
75 | 75 | import org.springframework.mock.web.MockHttpServletRequest;
|
76 | 76 | import org.springframework.security.access.prepost.PreAuthorize;
|
77 | 77 | import org.springframework.security.authentication.AbstractAuthenticationToken;
|
| 78 | +import org.springframework.security.authentication.AuthenticationDetailsSource; |
78 | 79 | import org.springframework.security.authentication.AuthenticationEventPublisher;
|
79 | 80 | import org.springframework.security.authentication.AuthenticationManager;
|
80 | 81 | import org.springframework.security.authentication.AuthenticationManagerResolver;
|
81 | 82 | import org.springframework.security.authentication.AuthenticationProvider;
|
82 | 83 | import org.springframework.security.authentication.AuthenticationServiceException;
|
| 84 | +import org.springframework.security.config.annotation.ObjectPostProcessor; |
83 | 85 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
84 | 86 | import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
|
85 | 87 | import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
109 | 111 | import org.springframework.security.oauth2.jwt.JwtTimestampValidator;
|
110 | 112 | import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
|
111 | 113 | import org.springframework.security.oauth2.jwt.TestJwts;
|
112 |
| -import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken; |
113 | 114 | import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthentication;
|
114 |
| -import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationConverter; |
115 | 115 | import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
|
116 | 116 | import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
117 | 117 | import org.springframework.security.oauth2.server.resource.authentication.JwtIssuerAuthenticationManagerResolver;
|
118 | 118 | import org.springframework.security.oauth2.server.resource.introspection.NimbusOpaqueTokenIntrospector;
|
119 | 119 | import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
|
120 | 120 | import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationEntryPoint;
|
| 121 | +import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter; |
121 | 122 | import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
|
122 | 123 | import org.springframework.security.oauth2.server.resource.web.DefaultBearerTokenResolver;
|
123 | 124 | import org.springframework.security.oauth2.server.resource.web.access.BearerTokenAccessDeniedHandler;
|
124 | 125 | import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
125 | 126 | import org.springframework.security.web.AuthenticationEntryPoint;
|
| 127 | +import org.springframework.security.web.SecurityFilterChain; |
126 | 128 | import org.springframework.security.web.access.AccessDeniedHandler;
|
127 | 129 | import org.springframework.security.web.access.AccessDeniedHandlerImpl;
|
128 | 130 | import org.springframework.test.web.servlet.MockMvc;
|
@@ -724,68 +726,14 @@ public void getBearerTokenResolverWhenNoResolverSpecifiedThenTheDefaultIsUsed()
|
724 | 726 | }
|
725 | 727 |
|
726 | 728 | @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.authenticationConverter(converter); |
736 |
| - assertThat(oauth2.getAuthenticationConverter()).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.authenticationConverter(converter); |
755 |
| - assertThat(oauth2.getAuthenticationConverter()).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.getAuthenticationConverter()).isInstanceOf(BearerTokenAuthenticationConverter.class); |
763 |
| - } |
764 |
| - |
765 |
| - @Test |
766 |
| - public void getBearerTokenAuthenticationConverterWhenConverterBeanRegisteredThenBeanIsUsed() { |
767 |
| - BearerTokenAuthenticationConverter converterBean = new BearerTokenAuthenticationConverter(); |
768 |
| - GenericWebApplicationContext context = new GenericWebApplicationContext(); |
769 |
| - context.registerBean(BearerTokenAuthenticationConverter.class, () -> converterBean); |
770 |
| - this.spring.context(context).autowire(); |
771 |
| - OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
772 |
| - assertThat(oauth2.getAuthenticationConverter()).isEqualTo(converterBean); |
773 |
| - |
774 |
| - } |
775 |
| - |
776 |
| - @Test |
777 |
| - public void getBearerTokenAuthenticationConverterWhenOnlyResolverBeanRegisteredThenUseTheResolver() { |
778 |
| - HttpServletRequest servletRequest = mock(HttpServletRequest.class); |
779 |
| - BearerTokenResolver resolverBean = (request) -> "bearer customToken"; |
780 |
| - GenericWebApplicationContext context = new GenericWebApplicationContext(); |
781 |
| - context.registerBean(BearerTokenResolver.class, () -> resolverBean); |
782 |
| - this.spring.context(context).autowire(); |
783 |
| - OAuth2ResourceServerConfigurer oauth2 = new OAuth2ResourceServerConfigurer(context); |
784 |
| - BearerTokenAuthenticationToken bearerTokenAuthenticationToken = (BearerTokenAuthenticationToken) oauth2 |
785 |
| - .getAuthenticationConverter().convert(servletRequest); |
786 |
| - String token = bearerTokenAuthenticationToken.getToken(); |
787 |
| - assertThat(token).isEqualTo("bearer customToken"); |
788 |
| - |
| 729 | + public void requestWhenCustomAuthenticationDetailsSourceThenUsed() throws Exception { |
| 730 | + this.spring.register(CustomAuthenticationDetailsSource.class, JwtDecoderConfig.class, BasicController.class) |
| 731 | + .autowire(); |
| 732 | + JwtDecoder decoder = this.spring.getContext().getBean(JwtDecoder.class); |
| 733 | + given(decoder.decode(anyString())).willReturn(JWT); |
| 734 | + this.mvc.perform(get("/authenticated").with(bearerToken(JWT_TOKEN))).andExpect(status().isOk()) |
| 735 | + .andExpect(content().string(JWT_SUBJECT)); |
| 736 | + verifyBean(AuthenticationDetailsSource.class).buildDetails(any()); |
789 | 737 | }
|
790 | 738 |
|
791 | 739 | @Test
|
@@ -1940,29 +1888,35 @@ BearerTokenResolver resolverTwo() {
|
1940 | 1888 | }
|
1941 | 1889 |
|
1942 | 1890 | @EnableWebSecurity
|
1943 |
| - static class MultipleBearerTokenAuthenticationConverterBeansConfig extends WebSecurityConfigurerAdapter { |
| 1891 | + static class CustomAuthenticationDetailsSource { |
1944 | 1892 |
|
1945 |
| - @Override |
1946 |
| - protected void configure(HttpSecurity http) throws Exception { |
1947 |
| - // @formatter:off |
1948 |
| - http |
1949 |
| - .oauth2ResourceServer() |
1950 |
| - .jwt(); |
1951 |
| - // @formatter:on |
1952 |
| - } |
| 1893 | + AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource = mock( |
| 1894 | + AuthenticationDetailsSource.class); |
1953 | 1895 |
|
1954 | 1896 | @Bean
|
1955 |
| - BearerTokenAuthenticationConverter converterOne() { |
1956 |
| - BearerTokenAuthenticationConverter converter = new BearerTokenAuthenticationConverter(); |
1957 |
| - return converter; |
| 1897 | + SecurityFilterChain web(HttpSecurity http) throws Exception { |
| 1898 | + // @formatter:off |
| 1899 | + http |
| 1900 | + .authorizeRequests((authorize) -> authorize |
| 1901 | + .anyRequest().authenticated() |
| 1902 | + ) |
| 1903 | + .oauth2ResourceServer((oauth2) -> oauth2 |
| 1904 | + .jwt(withDefaults()) |
| 1905 | + .withObjectPostProcessor(new ObjectPostProcessor<BearerTokenAuthenticationFilter>() { |
| 1906 | + @Override |
| 1907 | + public BearerTokenAuthenticationFilter postProcess(BearerTokenAuthenticationFilter object) { |
| 1908 | + object.setAuthenticationDetailsSource(CustomAuthenticationDetailsSource.this.authenticationDetailsSource); |
| 1909 | + return object; |
| 1910 | + } |
| 1911 | + }) |
| 1912 | + ); |
| 1913 | + return http.build(); |
1958 | 1914 | }
|
1959 | 1915 |
|
1960 | 1916 | @Bean
|
1961 |
| - BearerTokenAuthenticationConverter converterTwo() { |
1962 |
| - BearerTokenAuthenticationConverter converter = new BearerTokenAuthenticationConverter(); |
1963 |
| - return converter; |
| 1917 | + AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource() { |
| 1918 | + return this.authenticationDetailsSource; |
1964 | 1919 | }
|
1965 |
| - |
1966 | 1920 | }
|
1967 | 1921 |
|
1968 | 1922 | @EnableWebSecurity
|
|
0 commit comments