1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.security.oauth.config;
18
19 import org.springframework.beans.BeanMetadataElement;
20 import org.springframework.beans.factory.config.BeanDefinition;
21 import org.springframework.beans.factory.config.RuntimeBeanReference;
22 import org.springframework.beans.factory.support.BeanDefinitionBuilder;
23 import org.springframework.beans.factory.xml.BeanDefinitionParser;
24 import org.springframework.beans.factory.xml.ParserContext;
25 import org.springframework.security.oauth.consumer.client.CoreOAuthConsumerSupport;
26 import org.springframework.security.oauth.consumer.filter.OAuthConsumerContextFilter;
27 import org.springframework.security.oauth.consumer.filter.OAuthConsumerProcessingFilter;
28 import org.springframework.security.web.access.AccessDeniedHandlerImpl;
29 import org.springframework.util.StringUtils;
30 import org.w3c.dom.Element;
31
32 import java.util.List;
33
34
35
36
37
38
39
40
41 public class OAuthConsumerBeanDefinitionParser implements BeanDefinitionParser {
42
43 public BeanDefinition parse(Element element, ParserContext parserContext) {
44 BeanDefinitionBuilder consumerContextFilterBean = BeanDefinitionBuilder.rootBeanDefinition(OAuthConsumerContextFilter.class);
45
46 String failureHandlerRef = element.getAttribute("failure-handler-ref");
47 if (StringUtils.hasText(failureHandlerRef)) {
48 consumerContextFilterBean.addPropertyReference("OAuthFailureHandler", failureHandlerRef);
49 }
50 else {
51 String failurePage = element.getAttribute("oauth-failure-page");
52 if (StringUtils.hasText(failurePage)) {
53 AccessDeniedHandlerImpl failureHandler = new AccessDeniedHandlerImpl();
54 failureHandler.setErrorPage(failurePage);
55 consumerContextFilterBean.addPropertyValue("OAuthFailureHandler", failureHandler);
56 }
57 }
58
59 String resourceDetailsRef = element.getAttribute("resource-details-service-ref");
60 String supportRef = element.getAttribute("support-ref");
61 if (!StringUtils.hasText(supportRef)) {
62 BeanDefinitionBuilder consumerSupportBean = BeanDefinitionBuilder.rootBeanDefinition(CoreOAuthConsumerSupport.class);
63
64 if (StringUtils.hasText(resourceDetailsRef)) {
65 consumerSupportBean.addPropertyReference("protectedResourceDetailsService", resourceDetailsRef);
66 }
67 parserContext.getRegistry().registerBeanDefinition("oauthConsumerSupport", consumerSupportBean.getBeanDefinition());
68 supportRef = "oauthConsumerSupport";
69 }
70 consumerContextFilterBean.addPropertyReference("consumerSupport", supportRef);
71
72 String tokenServicesFactoryRef = element.getAttribute("token-services-ref");
73 if (StringUtils.hasText(tokenServicesFactoryRef)) {
74 consumerContextFilterBean.addPropertyReference("tokenServices", tokenServicesFactoryRef);
75 }
76
77 String rememberMeServicesRef = element.getAttribute("remember-me-services-ref");
78 if (StringUtils.hasText(rememberMeServicesRef)) {
79 consumerContextFilterBean.addPropertyReference("rememberMeServices", rememberMeServicesRef);
80 }
81
82 String redirectStrategyRef = element.getAttribute("redirect-strategy-ref");
83 if (StringUtils.hasText(redirectStrategyRef)) {
84 consumerContextFilterBean.addPropertyReference("redirectStrategy", redirectStrategyRef);
85 }
86
87 parserContext.getRegistry().registerBeanDefinition("oauthConsumerContextFilter", consumerContextFilterBean.getBeanDefinition());
88 List<BeanMetadataElement> filterChain = ConfigUtils.findFilterChain(parserContext, element.getAttribute("filter-chain-ref"));
89 filterChain.add(filterChain.size(), new RuntimeBeanReference("oauthConsumerContextFilter"));
90
91 BeanDefinition fids = ConfigUtils.createSecurityMetadataSource(element, parserContext);
92 if (fids != null) {
93 BeanDefinitionBuilder consumerAccessFilterBean = BeanDefinitionBuilder.rootBeanDefinition(OAuthConsumerProcessingFilter.class);
94
95 if (StringUtils.hasText(resourceDetailsRef)) {
96 consumerAccessFilterBean.addPropertyReference("protectedResourceDetailsService", resourceDetailsRef);
97 }
98
99 String requireAuthenticated = element.getAttribute("requireAuthenticated");
100 if (StringUtils.hasText(requireAuthenticated)) {
101 consumerAccessFilterBean.addPropertyValue("requireAuthenticated", requireAuthenticated);
102 }
103
104 consumerAccessFilterBean.addPropertyValue("objectDefinitionSource", fids);
105 parserContext.getRegistry().registerBeanDefinition("oauthConsumerFilter", consumerAccessFilterBean.getBeanDefinition());
106 filterChain.add(filterChain.size(), new RuntimeBeanReference("oauthConsumerFilter"));
107 }
108
109 return null;
110 }
111
112 }