From 24c1471f92c93a8c836c505898bf1ddc4da543c7 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 14 Aug 2017 10:33:58 -0400 Subject: [PATCH] Merged 1.2.x into master --- spring-cloud-sleuth-core/pom.xml | 5 ++ .../TraceWebClientAutoConfiguration.java | 69 +++++++++++++++++-- .../TraceWebClientAutoConfigurationTests.java | 62 +++++++++++++++++ .../src/test/resources/application.yml | 3 +- 4 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java diff --git a/spring-cloud-sleuth-core/pom.xml b/spring-cloud-sleuth-core/pom.xml index 79e36b7de..b6114a96e 100644 --- a/spring-cloud-sleuth-core/pom.xml +++ b/spring-cloud-sleuth-core/pom.xml @@ -55,6 +55,11 @@ spring-integration-core true + + org.springframework.security.oauth + spring-security-oauth2 + true + org.springframework spring-context diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java index 8e6b19d49..076fa5015 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java @@ -21,11 +21,15 @@ import java.util.Collection; import java.util.List; import javax.annotation.PostConstruct; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer; import org.springframework.cloud.sleuth.ErrorParser; import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.web.HttpSpanInjector; @@ -34,6 +38,7 @@ import org.springframework.cloud.sleuth.instrument.web.TraceWebAutoConfiguration import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.web.client.RestTemplate; /** @@ -73,12 +78,68 @@ public class TraceWebClientAutoConfiguration { public void init() { if (this.restTemplates != null) { for (RestTemplate restTemplate : this.restTemplates) { - List interceptors = new ArrayList( - restTemplate.getInterceptors()); - interceptors.add(this.traceRestTemplateInterceptor); - restTemplate.setInterceptors(interceptors); + new RestTemplateInterceptorInjector( + this.traceRestTemplateInterceptor).inject(restTemplate); } } } } + + @Configuration + @ConditionalOnClass(UserInfoRestTemplateCustomizer.class) + protected static class TraceOAuthConfiguration { + + @Autowired BeanFactory beanFactory; + + @Bean UserInfoRestTemplateCustomizerBPP userInfoRestTemplateCustomizerBeanPostProcessor() { + return new UserInfoRestTemplateCustomizerBPP(this.beanFactory); + } + + class UserInfoRestTemplateCustomizerBPP implements BeanPostProcessor { + + private final BeanFactory beanFactory; + + UserInfoRestTemplateCustomizerBPP(BeanFactory beanFactory) { + this.beanFactory = beanFactory; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, + String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(final Object bean, + String beanName) throws BeansException { + final BeanFactory beanFactory = this.beanFactory; + if (bean instanceof UserInfoRestTemplateCustomizer) { + return new UserInfoRestTemplateCustomizer() { + @Override public void customize(OAuth2RestTemplate template) { + final TraceRestTemplateInterceptor interceptor = + beanFactory.getBean(TraceRestTemplateInterceptor.class); + new RestTemplateInterceptorInjector(interceptor).inject(template); + ((UserInfoRestTemplateCustomizer) bean).customize(template); + } + }; + } + return bean; + } + } + } } + +class RestTemplateInterceptorInjector { + private final TraceRestTemplateInterceptor interceptor; + + RestTemplateInterceptorInjector(TraceRestTemplateInterceptor interceptor) { + this.interceptor = interceptor; + } + + void inject(RestTemplate restTemplate) { + List interceptors = new ArrayList( + restTemplate.getInterceptors()); + interceptors.add(this.interceptor); + restTemplate.setInterceptors(interceptors); + } +} \ No newline at end of file diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java new file mode 100644 index 000000000..40e6702e1 --- /dev/null +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java @@ -0,0 +1,62 @@ +package org.springframework.cloud.sleuth.instrument.web.client; + +import org.assertj.core.api.BDDAssertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; +import org.springframework.cloud.sleuth.instrument.web.TraceHttpAutoConfiguration; +import org.springframework.cloud.sleuth.instrument.web.TraceWebAutoConfiguration; +import org.springframework.cloud.sleuth.log.SleuthLogAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.oauth2.client.OAuth2RestTemplate; +import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.BDDAssertions.then; + +/** + * @author Marcin Grzejszczak + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = TraceWebClientAutoConfigurationTests.Config.class) +public class TraceWebClientAutoConfigurationTests { + + @Autowired Config config; + @Autowired UserInfoRestTemplateCustomizer customizer; + @Autowired TraceRestTemplateInterceptor interceptor; + + @Test + public void should_wrap_UserInfoRestTemplateCustomizer_in_a_trace_representation() { + OAuth2ProtectedResourceDetails details = Mockito.mock(OAuth2ProtectedResourceDetails.class); + OAuth2RestTemplate template = new OAuth2RestTemplate(details); + + this.customizer.customize(template); + + then(this.config.executed).isTrue(); + then(template.getInterceptors()).contains(this.interceptor); + } + + + @Configuration + @ImportAutoConfiguration(classes = { + TraceWebClientAutoConfiguration.class, SleuthLogAutoConfiguration.class, + TraceHttpAutoConfiguration.class, TraceWebAutoConfiguration.class, TraceAutoConfiguration.class }) + static class Config { + + boolean executed = false; + + @Bean UserInfoRestTemplateCustomizer customizer() { + return new UserInfoRestTemplateCustomizer() { + @Override public void customize(OAuth2RestTemplate template) { + Config.this.executed = true; + } + }; + } + } +} \ No newline at end of file diff --git a/spring-cloud-sleuth-core/src/test/resources/application.yml b/spring-cloud-sleuth-core/src/test/resources/application.yml index 5b9e8f669..293cf2e33 100644 --- a/spring-cloud-sleuth-core/src/test/resources/application.yml +++ b/spring-cloud-sleuth-core/src/test/resources/application.yml @@ -14,4 +14,5 @@ ribbon.eureka.enabled: false spring.sleuth.scheduled.skipPattern: "^org.*TestBeanWithScheduledMethodToBeIgnored$" # comma separated list of matchers -spring.sleuth.rxjava.schedulers.ignoredthreads: HystixMetricPoller,^MyCustomThread.*$,^RxComputation.*$ \ No newline at end of file +spring.sleuth.rxjava.schedulers.ignoredthreads: HystixMetricPoller,^MyCustomThread.*$,^RxComputation.*$ +security.ignored: /** \ No newline at end of file