diff --git a/core/src/main/java/org/springframework/security/config/HttpSecurityBeanDefinitionParser.java b/core/src/main/java/org/springframework/security/config/HttpSecurityBeanDefinitionParser.java index 92d0d5f55e..317be2f9a3 100644 --- a/core/src/main/java/org/springframework/security/config/HttpSecurityBeanDefinitionParser.java +++ b/core/src/main/java/org/springframework/security/config/HttpSecurityBeanDefinitionParser.java @@ -50,7 +50,7 @@ import org.w3c.dom.Element; * @version $Id$ */ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser { - protected final Log logger = LogFactory.getLog(getClass()); + static final Log logger = LogFactory.getLog(HttpSecurityBeanDefinitionParser.class); static final String ATT_REALM = "realm"; static final String DEF_REALM = "Spring Security Application"; @@ -605,7 +605,13 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser { // Convert the comma-separated list of access attributes to a ConfigAttributeDefinition if (StringUtils.hasText(access)) { editor.setAsText(access); - filterInvocationDefinitionMap.put(new RequestKey(path, method), editor.getValue()); + Object key = new RequestKey(path, method); + + if (filterInvocationDefinitionMap.containsKey(key)) { + logger.warn("Duplicate URL defined: " + key + ". The original attribute values will be overwritten"); + } + + filterInvocationDefinitionMap.put(key, editor.getValue()); } } diff --git a/core/src/main/java/org/springframework/security/intercept/web/RequestKey.java b/core/src/main/java/org/springframework/security/intercept/web/RequestKey.java index 44b4528ba2..aed8977461 100644 --- a/core/src/main/java/org/springframework/security/intercept/web/RequestKey.java +++ b/core/src/main/java/org/springframework/security/intercept/web/RequestKey.java @@ -54,4 +54,16 @@ public class RequestKey { return method.equals(key.method); } + + public String toString() { + StringBuffer sb = new StringBuffer(url.length() + 7); + sb.append("["); + if (method != null) { + sb.append(method).append(","); + } + sb.append(url); + sb.append("]"); + + return sb.toString(); + } } diff --git a/core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java b/core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java index b6c1ad5c2f..4b9da90188 100644 --- a/core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java +++ b/core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java @@ -608,7 +608,6 @@ public class HttpSecurityBeanDefinitionParserTests { @Test public void settingCreateSessionToAlwaysSetsFilterPropertiesCorrectly() throws Exception { - // Protected, no anonymous filter configured. setContext("" + AUTH_PROVIDER_XML); assertEquals(Boolean.TRUE, FieldUtils.getFieldValue(appContext.getBean(BeanIds.HTTP_SESSION_CONTEXT_INTEGRATION_FILTER), "forceEagerSessionCreation")); assertEquals(Boolean.TRUE, FieldUtils.getFieldValue(appContext.getBean(BeanIds.HTTP_SESSION_CONTEXT_INTEGRATION_FILTER), "allowSessionCreation")); @@ -616,12 +615,27 @@ public class HttpSecurityBeanDefinitionParserTests { @Test public void settingCreateSessionToNeverSetsFilterPropertiesCorrectly() throws Exception { - // Protected, no anonymous filter configured. setContext("" + AUTH_PROVIDER_XML); assertEquals(Boolean.FALSE, FieldUtils.getFieldValue(appContext.getBean(BeanIds.HTTP_SESSION_CONTEXT_INTEGRATION_FILTER), "forceEagerSessionCreation")); assertEquals(Boolean.FALSE, FieldUtils.getFieldValue(appContext.getBean(BeanIds.HTTP_SESSION_CONTEXT_INTEGRATION_FILTER), "allowSessionCreation")); } + /* SEC-934 */ + @Test + public void supportsTwoIdenticalInterceptUrls() { + setContext( + "" + + " " + + " " + + "" + AUTH_PROVIDER_XML); + FilterSecurityInterceptor fis = (FilterSecurityInterceptor) appContext.getBean(BeanIds.FILTER_SECURITY_INTERCEPTOR); + + FilterInvocationDefinitionSource fids = fis.getObjectDefinitionSource(); + ConfigAttributeDefinition attrDef = fids.getAttributes(createFilterinvocation("/someurl", null)); + assertEquals(1, attrDef.getConfigAttributes().size()); + assertTrue(attrDef.contains(new SecurityConfig("ROLE_B"))); + } + private void setContext(String context) { appContext = new InMemoryXmlApplicationContext(context); }