5
5
import org .apache .commons .logging .Log ;
6
6
import org .apache .commons .logging .LogFactory ;
7
7
import org .springframework .beans .factory .config .BeanDefinition ;
8
+ import org .springframework .beans .factory .parsing .BeanComponentDefinition ;
8
9
import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
9
10
import org .springframework .beans .factory .support .ManagedMap ;
10
- import org .springframework .beans .factory .xml .AbstractSingleBeanDefinitionParser ;
11
+ import org .springframework .beans .factory .xml .AbstractBeanDefinitionParser ;
12
+ import org .springframework .beans .factory .xml .BeanDefinitionParser ;
11
13
import org .springframework .beans .factory .xml .ParserContext ;
12
14
import org .springframework .security .access .SecurityConfig ;
15
+ import org .springframework .security .config .Elements ;
16
+ import org .springframework .security .web .access .expression .DefaultWebSecurityExpressionHandler ;
17
+ import org .springframework .security .web .access .expression .ExpressionBasedFilterInvocationSecurityMetadataSource ;
18
+ import org .springframework .security .web .access .intercept .DefaultFilterInvocationSecurityMetadataSource ;
13
19
import org .springframework .security .web .access .intercept .FilterInvocationSecurityMetadataSource ;
14
20
import org .springframework .security .web .access .intercept .RequestKey ;
15
21
import org .springframework .security .web .util .AntUrlPathMatcher ;
24
30
* @author Luke Taylor
25
31
* @version $Id$
26
32
*/
27
- public class FilterInvocationSecurityMetadataSourceBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
28
-
33
+ public class FilterInvocationSecurityMetadataSourceParser implements BeanDefinitionParser {
34
+ private static final String ATT_USE_EXPRESSIONS = "use-expressions" ;
29
35
private static final String ATT_HTTP_METHOD = "method" ;
30
36
private static final String ATT_PATTERN = "pattern" ;
31
37
private static final String ATT_ACCESS = "access" ;
32
- private static final Log logger = LogFactory .getLog (FilterInvocationSecurityMetadataSourceBeanDefinitionParser .class );
33
-
34
- protected String getBeanClassName (Element element ) {
35
- return "org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource" ;
36
- }
38
+ private static final Log logger = LogFactory .getLog (FilterInvocationSecurityMetadataSourceParser .class );
37
39
38
- protected void doParse (Element element , ParserContext parserContext , BeanDefinitionBuilder builder ) {
40
+ public BeanDefinition parse (Element element , ParserContext parserContext ) {
39
41
List <Element > interceptUrls = DomUtils .getChildElementsByTagName (element , "intercept-url" );
40
42
41
43
// Check for attributes that aren't allowed in this context
@@ -49,17 +51,60 @@ protected void doParse(Element element, ParserContext parserContext, BeanDefinit
49
51
}
50
52
}
51
53
52
- UrlMatcher matcher = HttpSecurityBeanDefinitionParser .createUrlMatcher (element );
54
+ BeanDefinition mds = createSecurityMetadataSource (interceptUrls , element , parserContext );
55
+
56
+ String id = element .getAttribute (AbstractBeanDefinitionParser .ID_ATTRIBUTE );
57
+
58
+ if (StringUtils .hasText (id )) {
59
+ parserContext .registerComponent (new BeanComponentDefinition (mds , id ));
60
+ parserContext .getRegistry ().registerBeanDefinition (id , mds );
61
+ }
62
+
63
+ return mds ;
64
+ }
65
+
66
+ static BeanDefinition createSecurityMetadataSource (List <Element > interceptUrls , Element elt , ParserContext pc ) {
67
+ UrlMatcher matcher = HttpSecurityBeanDefinitionParser .createUrlMatcher (elt );
53
68
boolean convertPathsToLowerCase = (matcher instanceof AntUrlPathMatcher ) && matcher .requiresLowerCaseUrl ();
69
+ boolean useExpressions = isUseExpressions (elt );
70
+
71
+ ManagedMap <BeanDefinition , BeanDefinition > requestToAttributesMap = parseInterceptUrlsForFilterInvocationRequestMap (
72
+ interceptUrls , convertPathsToLowerCase , useExpressions , pc );
73
+ BeanDefinitionBuilder fidsBuilder ;
54
74
55
- ManagedMap <BeanDefinition , BeanDefinition > requestMap = parseInterceptUrlsForFilterInvocationRequestMap (
56
- interceptUrls , convertPathsToLowerCase , false , parserContext );
75
+ if (useExpressions ) {
76
+ Element expressionHandlerElt = DomUtils .getChildElementByTagName (elt , Elements .EXPRESSION_HANDLER );
77
+ String expressionHandlerRef = expressionHandlerElt == null ? null : expressionHandlerElt .getAttribute ("ref" );
57
78
58
- builder .addConstructorArgValue (matcher );
59
- builder .addConstructorArgValue (requestMap );
79
+ if (StringUtils .hasText (expressionHandlerRef )) {
80
+ logger .info ("Using bean '" + expressionHandlerRef + "' as web SecurityExpressionHandler implementation" );
81
+ } else {
82
+ BeanDefinition expressionHandler = BeanDefinitionBuilder .rootBeanDefinition (DefaultWebSecurityExpressionHandler .class ).getBeanDefinition ();
83
+ expressionHandlerRef = pc .getReaderContext ().registerWithGeneratedName (expressionHandler );
84
+ pc .registerBeanComponent (new BeanComponentDefinition (expressionHandler , expressionHandlerRef ));
85
+ }
86
+
87
+ fidsBuilder = BeanDefinitionBuilder .rootBeanDefinition (ExpressionBasedFilterInvocationSecurityMetadataSource .class );
88
+ fidsBuilder .addConstructorArgValue (matcher );
89
+ fidsBuilder .addConstructorArgValue (requestToAttributesMap );
90
+ fidsBuilder .addConstructorArgReference (expressionHandlerRef );
91
+ } else {
92
+ fidsBuilder = BeanDefinitionBuilder .rootBeanDefinition (DefaultFilterInvocationSecurityMetadataSource .class );
93
+ fidsBuilder .addConstructorArgValue (matcher );
94
+ fidsBuilder .addConstructorArgValue (requestToAttributesMap );
95
+ }
96
+
97
+ fidsBuilder .addPropertyValue ("stripQueryStringFromUrls" , matcher instanceof AntUrlPathMatcher );
98
+ fidsBuilder .getRawBeanDefinition ().setSource (pc .extractSource (elt ));
99
+
100
+ return fidsBuilder .getBeanDefinition ();
101
+ }
102
+
103
+ static boolean isUseExpressions (Element elt ) {
104
+ return "true" .equals (elt .getAttribute (ATT_USE_EXPRESSIONS ));
60
105
}
61
106
62
- static ManagedMap <BeanDefinition , BeanDefinition > parseInterceptUrlsForFilterInvocationRequestMap (List <Element > urlElts ,
107
+ private static ManagedMap <BeanDefinition , BeanDefinition > parseInterceptUrlsForFilterInvocationRequestMap (List <Element > urlElts ,
63
108
boolean useLowerCasePaths , boolean useExpressions , ParserContext parserContext ) {
64
109
65
110
ManagedMap <BeanDefinition , BeanDefinition > filterInvocationDefinitionMap = new ManagedMap <BeanDefinition , BeanDefinition >();
@@ -114,4 +159,6 @@ static ManagedMap<BeanDefinition, BeanDefinition> parseInterceptUrlsForFilterInv
114
159
115
160
return filterInvocationDefinitionMap ;
116
161
}
162
+
163
+
117
164
}
0 commit comments