diff --git a/core/src/main/java/org/springframework/security/util/FilterChainProxy.java b/core/src/main/java/org/springframework/security/util/FilterChainProxy.java index 3fd8ddd08c..68ca420a21 100644 --- a/core/src/main/java/org/springframework/security/util/FilterChainProxy.java +++ b/core/src/main/java/org/springframework/security/util/FilterChainProxy.java @@ -176,12 +176,11 @@ public class FilterChainProxy implements Filter, InitializingBean, ApplicationCo /** * Returns the first filter chain matching the supplied URL. - * TODO: Change tests and make package protected access. * * @param url the request URL * @return an ordered array of Filters defining the filter chain */ - public List getFilters(String url) { + List getFilters(String url) { Iterator filterChains = filterChainMap.entrySet().iterator(); while (filterChains.hasNext()) { 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 336141076a..bf9a80ed0b 100644 --- a/core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java +++ b/core/src/test/java/org/springframework/security/config/HttpSecurityBeanDefinitionParserTests.java @@ -2,6 +2,7 @@ package org.springframework.security.config; import static org.junit.Assert.*; +import java.lang.reflect.Method; import java.util.Iterator; import java.util.List; @@ -40,6 +41,7 @@ import org.springframework.security.util.FilterChainProxy; import org.springframework.security.util.InMemoryXmlApplicationContext; import org.springframework.security.util.PortMapperImpl; import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter; +import org.springframework.util.ReflectionUtils; /** * @author Luke Taylor @@ -64,12 +66,10 @@ public class HttpSecurityBeanDefinitionParserTests { } @Test - public void httpAutoConfigSetsUpCorrectFilterList() { + public void httpAutoConfigSetsUpCorrectFilterList() throws Exception { setContext("" + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - - List filterList = filterChainProxy.getFilters("/anyurl"); + List filterList = getFilters("/anyurl"); checkAutoConfigFilters(filterList); } @@ -93,54 +93,49 @@ public class HttpSecurityBeanDefinitionParserTests { } @Test - public void filterListShouldBeEmptyForUnprotectedUrl() { + public void filterListShouldBeEmptyForUnprotectedUrl() throws Exception { setContext( " " + " " + " " + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - - List filters = filterChainProxy.getFilters("/unprotected"); + List filters = getFilters("/unprotected"); assertTrue(filters.size() == 0); } @Test - public void regexPathsWorkCorrectly() { + public void regexPathsWorkCorrectly() throws Exception { setContext( " " + " " + " " + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - assertEquals(0, filterChainProxy.getFilters("/imlowercase").size()); + assertEquals(0, getFilters("/imlowercase").size()); // This will be matched by the default pattern ".*" - checkAutoConfigFilters(filterChainProxy.getFilters("/ImCaughtByTheUniversalMatchPattern")); + checkAutoConfigFilters(getFilters("/ImCaughtByTheUniversalMatchPattern")); } @Test - public void lowerCaseComparisonAttributeIsRespectedByFilterChainProxy() { + public void lowerCaseComparisonAttributeIsRespectedByFilterChainProxy() throws Exception { setContext( " " + " " + " " + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - assertEquals(0, filterChainProxy.getFilters("/Secure").size()); + assertEquals(0, getFilters("/Secure").size()); // These will be matched by the default pattern "/**" - checkAutoConfigFilters(filterChainProxy.getFilters("/secure")); - checkAutoConfigFilters(filterChainProxy.getFilters("/ImCaughtByTheUniversalMatchPattern")); + checkAutoConfigFilters(getFilters("/secure")); + checkAutoConfigFilters(getFilters("/ImCaughtByTheUniversalMatchPattern")); } @Test - public void formLoginWithNoLoginPageAddsDefaultLoginPageFilter() { + public void formLoginWithNoLoginPageAddsDefaultLoginPageFilter() throws Exception { setContext( " " + " " + " " + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); // These will be matched by the default pattern "/**" - checkAutoConfigFilters(filterChainProxy.getFilters("/anything")); + checkAutoConfigFilters(getFilters("/anything")); } @Test @@ -186,10 +181,9 @@ public class HttpSecurityBeanDefinitionParserTests { } @Test - public void oncePerRequestAttributeIsSupported() { + public void oncePerRequestAttributeIsSupported() throws Exception { setContext("" + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - List filters = filterChainProxy.getFilters("/someurl"); + List filters = getFilters("/someurl"); FilterSecurityInterceptor fsi = (FilterSecurityInterceptor) filters.get(filters.size() - 1); @@ -199,8 +193,7 @@ public class HttpSecurityBeanDefinitionParserTests { @Test public void accessDeniedPageAttributeIsSupported() throws Exception { setContext("" + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - List filters = filterChainProxy.getFilters("/someurl"); + List filters = getFilters("/someurl"); ExceptionTranslationFilter etf = (ExceptionTranslationFilter) filters.get(filters.size() - 2); @@ -208,13 +201,12 @@ public class HttpSecurityBeanDefinitionParserTests { } @Test - public void interceptUrlWithRequiresChannelAddsChannelFilterToStack() { + public void interceptUrlWithRequiresChannelAddsChannelFilterToStack() throws Exception { setContext( " " + " " + " " + AUTH_PROVIDER_XML); - FilterChainProxy filterChainProxy = getFilterChainProxy(); - List filters = filterChainProxy.getFilters("/someurl"); + List filters = getFilters("/someurl"); assertEquals("Expected 12 filters in chain", 12, filters.size()); @@ -237,7 +229,7 @@ public class HttpSecurityBeanDefinitionParserTests { } @Test - public void externalFiltersAreTreatedCorrectly() { + public void externalFiltersAreTreatedCorrectly() throws Exception { // Decorated user-filter should be added to stack. The other one should be ignored setContext( "" + AUTH_PROVIDER_XML + @@ -245,7 +237,7 @@ public class HttpSecurityBeanDefinitionParserTests { " " + "" + ""); - List filters = getFilterChainProxy().getFilters("/someurl"); + List filters = getFilters("/someurl"); assertEquals(12, filters.size()); assertTrue(filters.get(1) instanceof OrderedFilterBeanDefinitionDecorator.OrderedFilterDecorator); @@ -282,7 +274,7 @@ public class HttpSecurityBeanDefinitionParserTests { "" + " " + "" + AUTH_PROVIDER_XML); - List filters = getFilterChainProxy().getFilters("/someurl"); + List filters = getFilters("/someurl"); assertTrue(filters.get(3) instanceof X509PreAuthenticatedProcessingFilter); } @@ -293,7 +285,7 @@ public class HttpSecurityBeanDefinitionParserTests { "" + " " + "" + AUTH_PROVIDER_XML); - List filters = getFilterChainProxy().getFilters("/someurl"); + List filters = getFilters("/someurl"); assertTrue(filters.get(0) instanceof ConcurrentSessionFilter); assertNotNull(appContext.getBean("seshRegistry")); @@ -332,13 +324,13 @@ public class HttpSecurityBeanDefinitionParserTests { } @Test - public void customEntryPointIsSupported() { + public void customEntryPointIsSupported() throws Exception { setContext( "" + "" + " " + "" + AUTH_PROVIDER_XML); - ExceptionTranslationFilter etf = (ExceptionTranslationFilter) getFilterChainProxy().getFilters("/someurl").get(9); + ExceptionTranslationFilter etf = (ExceptionTranslationFilter) getFilters("/someurl").get(9); assertTrue("ExceptionTranslationFilter should be configured with custom entry point", etf.getAuthenticationEntryPoint() instanceof MockAuthenticationEntryPoint); } @@ -359,7 +351,7 @@ public class HttpSecurityBeanDefinitionParserTests { public void disablingSessionProtectionRemovesFilter() throws Exception { setContext( "" + AUTH_PROVIDER_XML); - List filters = getFilterChainProxy().getFilters("/someurl"); + List filters = getFilters("/someurl"); assertFalse(filters.get(1) instanceof SessionFixationProtectionFilter); } @@ -387,6 +379,13 @@ public class HttpSecurityBeanDefinitionParserTests { appContext = new InMemoryXmlApplicationContext(context); } + private List getFilters(String url) throws Exception { + FilterChainProxy fcp = (FilterChainProxy) appContext.getBean(BeanIds.FILTER_CHAIN_PROXY); + Method getFilters = fcp.getClass().getDeclaredMethod("getFilters", String.class); + getFilters.setAccessible(true); + return (List) ReflectionUtils.invokeMethod(getFilters, fcp, new Object[] {url}); + } + private FilterChainProxy getFilterChainProxy() { return (FilterChainProxy) appContext.getBean(BeanIds.FILTER_CHAIN_PROXY); }