diff --git a/config/src/main/java/org/springframework/security/config/http/FilterChainBeanDefinitionParser.java b/config/src/main/java/org/springframework/security/config/http/FilterChainBeanDefinitionParser.java
index b3b43320f5..e4b833a43e 100644
--- a/config/src/main/java/org/springframework/security/config/http/FilterChainBeanDefinitionParser.java
+++ b/config/src/main/java/org/springframework/security/config/http/FilterChainBeanDefinitionParser.java
@@ -5,7 +5,10 @@ import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
+import org.springframework.beans.factory.xml.BeanDefinitionParser;
+import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
@@ -14,20 +17,24 @@ import java.util.*;
/**
* @author Luke Taylor
*/
-public class FilterChainBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
+public class FilterChainBeanDefinitionParser implements BeanDefinitionParser {
+ private static final String ATT_REQUEST_MATCHER_REF = "request-matcher-ref";
- @Override
- protected Class getBeanClass(Element element) {
- return SecurityFilterChain.class;
- }
-
- @Override
- protected void doParse(Element elt, BeanDefinitionBuilder builder) {
+ public BeanDefinition parse(Element elt, ParserContext pc) {
MatcherType matcherType = MatcherType.fromElement(elt);
String path = elt.getAttribute(HttpSecurityBeanDefinitionParser.ATT_PATH_PATTERN);
+ String requestMatcher = elt.getAttribute(ATT_REQUEST_MATCHER_REF);
String filters = elt.getAttribute(HttpSecurityBeanDefinitionParser.ATT_FILTERS);
- builder.addConstructorArgValue(matcherType.createMatcher(path, null));
+ BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(SecurityFilterChain.class);
+
+ if (StringUtils.hasText(path)) {
+ Assert.isTrue(!StringUtils.hasText(requestMatcher), "");
+ builder.addConstructorArgValue(matcherType.createMatcher(path, null));
+ } else {
+ Assert.isTrue(StringUtils.hasText(requestMatcher), "");
+ builder.addConstructorArgReference(requestMatcher);
+ }
if (filters.equals(HttpSecurityBeanDefinitionParser.OPT_FILTERS_NONE)) {
builder.addConstructorArgValue(Collections.EMPTY_LIST);
@@ -41,5 +48,7 @@ public class FilterChainBeanDefinitionParser extends AbstractSingleBeanDefinitio
builder.addConstructorArgValue(filterChain);
}
+
+ return builder.getBeanDefinition();
}
}
diff --git a/config/src/main/resources/org/springframework/security/config/spring-security-3.1.rnc b/config/src/main/resources/org/springframework/security/config/spring-security-3.1.rnc
index cedf2a0eb4..7377955b6c 100644
--- a/config/src/main/resources/org/springframework/security/config/spring-security-3.1.rnc
+++ b/config/src/main/resources/org/springframework/security/config/spring-security-3.1.rnc
@@ -446,7 +446,7 @@ filter-chain =
## Used within to define a specific URL pattern and the list of filters which apply to the URLs matching that pattern. When multiple filter-chain elements are assembled in a list in order to configure a FilterChainProxy, the most specific patterns must be placed at the top of the list, with most general ones at the bottom.
element filter-chain {filter-chain.attlist, empty}
filter-chain.attlist &=
- attribute pattern {xsd:token}
+ (attribute pattern {xsd:token} | attribute request-matcher-ref {xsd:token})
filter-chain.attlist &=
attribute filters {xsd:token}
diff --git a/config/src/main/resources/org/springframework/security/config/spring-security-3.1.xsd b/config/src/main/resources/org/springframework/security/config/spring-security-3.1.xsd
index c66ab98bc9..1ba7bb1f43 100644
--- a/config/src/main/resources/org/springframework/security/config/spring-security-3.1.xsd
+++ b/config/src/main/resources/org/springframework/security/config/spring-security-3.1.xsd
@@ -1006,7 +1006,8 @@
-
+
+
diff --git a/config/src/test/resources/org/springframework/security/util/filtertest-valid.xml b/config/src/test/resources/org/springframework/security/util/filtertest-valid.xml
index 1349ac5a53..2f4600f5d3 100644
--- a/config/src/test/resources/org/springframework/security/util/filtertest-valid.xml
+++ b/config/src/test/resources/org/springframework/security/util/filtertest-valid.xml
@@ -47,10 +47,14 @@
+
+
+
+
-
+
@@ -121,11 +125,7 @@
-
-
-
-
-
+