1
2
3
4
5
6
7
8
9
10
11
12
13 package org.springframework.security.oauth2.config.xml;
14
15 import org.springframework.aop.scope.ScopedProxyUtils;
16 import org.springframework.beans.factory.config.BeanDefinition;
17 import org.springframework.beans.factory.config.BeanDefinitionHolder;
18 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
19 import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
20 import org.springframework.beans.factory.xml.ParserContext;
21 import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
22 import org.springframework.security.oauth2.client.OAuth2RestTemplate;
23 import org.springframework.security.oauth2.client.token.DefaultAccessTokenRequest;
24 import org.springframework.util.StringUtils;
25 import org.w3c.dom.Element;
26
27
28
29
30
31 public class RestTemplateBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
32
33 @Override
34 protected Class<?> getBeanClass(Element element) {
35 return OAuth2RestTemplate.class;
36 }
37
38 @Override
39 protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
40
41 String accessTokenProviderRef = element.getAttribute("access-token-provider");
42
43 builder.addConstructorArgReference(element.getAttribute("resource"));
44
45 BeanDefinitionBuilder request = BeanDefinitionBuilder.genericBeanDefinition(DefaultAccessTokenRequest.class);
46 request.setScope("request");
47 request.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
48 request.addConstructorArgValue("#{request.parameterMap}");
49 request.addPropertyValue("currentUri", "#{request.getAttribute('currentUri')}");
50
51 BeanDefinitionHolder requestDefinition = new BeanDefinitionHolder(request.getRawBeanDefinition(), parserContext
52 .getReaderContext().generateBeanName(request.getRawBeanDefinition()));
53 parserContext.getRegistry().registerBeanDefinition(requestDefinition.getBeanName(),
54 requestDefinition.getBeanDefinition());
55 BeanDefinitionHolder requestHolder = ScopedProxyUtils.createScopedProxy(requestDefinition,
56 parserContext.getRegistry(), false);
57
58 BeanDefinitionBuilder scopedContext = BeanDefinitionBuilder
59 .genericBeanDefinition(DefaultOAuth2ClientContext.class);
60 scopedContext.setScope("session");
61 scopedContext.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
62 BeanDefinitionHolder contextDefinition = new BeanDefinitionHolder(scopedContext.getRawBeanDefinition(),
63 parserContext.getReaderContext().generateBeanName(scopedContext.getRawBeanDefinition()));
64 parserContext.getRegistry().registerBeanDefinition(contextDefinition.getBeanName(),
65 contextDefinition.getBeanDefinition());
66 BeanDefinitionHolder contextHolder = ScopedProxyUtils.createScopedProxy(contextDefinition,
67 parserContext.getRegistry(), false);
68 scopedContext.addConstructorArgValue(requestHolder.getBeanDefinition());
69
70 BeanDefinitionBuilder bareContext = BeanDefinitionBuilder
71 .genericBeanDefinition(DefaultOAuth2ClientContext.class);
72
73 BeanDefinitionBuilder context = BeanDefinitionBuilder
74 .genericBeanDefinition(OAuth2ClientContextFactoryBean.class);
75
76 context.addPropertyValue("scopedContext", contextHolder.getBeanDefinition());
77 context.addPropertyValue("bareContext", bareContext.getBeanDefinition());
78 context.addPropertyReference("resource", element.getAttribute("resource"));
79
80 builder.addConstructorArgValue(context.getBeanDefinition());
81 if (StringUtils.hasText(accessTokenProviderRef)) {
82 builder.addPropertyReference("accessTokenProvider", accessTokenProviderRef);
83 }
84
85 parserContext.getDelegate().parsePropertyElements(element, builder.getBeanDefinition());
86
87 }
88
89 }