1 package org.springframework.security.config;
2
3 import org.springframework.beans.factory.config.BeanDefinition;
4 import org.springframework.beans.factory.config.BeanDefinitionHolder;
5 import org.springframework.beans.factory.config.RuntimeBeanReference;
6 import org.springframework.beans.factory.support.ManagedList;
7 import org.springframework.beans.factory.support.ManagedMap;
8 import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
9 import org.springframework.beans.factory.xml.ParserContext;
10 import org.springframework.security.util.RegexUrlPathMatcher;
11 import org.springframework.util.StringUtils;
12 import org.springframework.util.xml.DomUtils;
13 import org.w3c.dom.Element;
14 import org.w3c.dom.Node;
15
16 import java.util.*;
17
18
19
20
21
22
23
24 class FilterChainMapBeanDefinitionDecorator implements BeanDefinitionDecorator {
25 public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder holder, ParserContext parserContext) {
26 BeanDefinition filterChainProxy = holder.getBeanDefinition();
27
28 Map filterChainMap = new LinkedHashMap();
29 Element elt = (Element)node;
30
31 String pathType = elt.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATH_TYPE);
32
33 if (HttpSecurityBeanDefinitionParser.OPT_PATH_TYPE_REGEX.equals(pathType)) {
34 filterChainProxy.getPropertyValues().addPropertyValue("matcher", new RegexUrlPathMatcher());
35 }
36
37 Iterator filterChainElts = DomUtils.getChildElementsByTagName(elt, Elements.FILTER_CHAIN).iterator();
38
39 while (filterChainElts.hasNext()) {
40 Element chain = (Element) filterChainElts.next();
41 String path = chain.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN);
42
43 if(!StringUtils.hasText(path)) {
44 parserContext.getReaderContext().error("The attribute '" + HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN +
45 "' must not be empty", elt);
46 }
47
48 String filters = chain.getAttribute(HttpSecurityBeanDefinitionParser.ATT_FILTERS);
49
50 if(!StringUtils.hasText(filters)) {
51 parserContext.getReaderContext().error("The attribute '" + HttpSecurityBeanDefinitionParser.ATT_FILTERS +
52 "'must not be empty", elt);
53 }
54
55 if (filters.equals(HttpSecurityBeanDefinitionParser.OPT_FILTERS_NONE)) {
56 filterChainMap.put(path, Collections.EMPTY_LIST);
57 } else {
58 String[] filterBeanNames = StringUtils.tokenizeToStringArray(filters, ",");
59 ManagedList filterChain = new ManagedList(filterBeanNames.length);
60
61 for (int i=0; i < filterBeanNames.length; i++) {
62 filterChain.add(new RuntimeBeanReference(filterBeanNames[i]));
63 }
64
65 filterChainMap.put(path, filterChain);
66 }
67 }
68
69 ManagedMap map = new ManagedMap(filterChainMap.size());
70 map.putAll(filterChainMap);
71
72 filterChainProxy.getPropertyValues().addPropertyValue("filterChainMap", map);
73
74 return holder;
75 }
76 }