SEC-1125: Created separate web module spring-security-web

This commit is contained in:
Luke Taylor 2009-03-25 06:28:18 +00:00
parent 2c985a1c36
commit 2a9a8a41db
247 changed files with 611 additions and 506 deletions
acl
pom.xml
src/test/java/org/springframework/security/acls/domain
cas
config
core
itest/context/src/test
java/org/springframework/security/performance
resources
ldap
ntlm
openid
pom.xml
src/test/java/org/springframework/security/ui/openid
pom.xml
portlet/src/test/java/org/springframework/security/ui/portlet
samples
sandbox/other
taglibs
web

@ -56,10 +56,6 @@
<artifactId>hsqldb</artifactId> <artifactId>hsqldb</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -14,9 +14,8 @@
*/ */
package org.springframework.security.acls.domain; package org.springframework.security.acls.domain;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import org.junit.Test; import org.junit.Test;
import org.springframework.security.acls.Permission; import org.springframework.security.acls.Permission;
@ -28,9 +27,6 @@ import org.springframework.security.acls.Permission;
* @version $Id${date} * @version $Id${date}
*/ */
public class PermissionTests { public class PermissionTests {
private static final Log LOGGER = LogFactory.getLog(PermissionTests.class);
//~ Methods ========================================================================================================
@Test @Test
public void basePermissionTest() { public void basePermissionTest() {

@ -15,6 +15,11 @@
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>

@ -15,6 +15,18 @@
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>commons-logging</groupId> <groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId> <artifactId>commons-logging</artifactId>

@ -9,7 +9,7 @@ import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider; import org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider;
import org.springframework.security.providers.anonymous.AnonymousProcessingFilter; import org.springframework.security.ui.anonymous.AnonymousProcessingFilter;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;

@ -14,11 +14,11 @@ import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.security.afterinvocation.AfterInvocationProviderManager; import org.springframework.security.afterinvocation.AfterInvocationProviderManager;
import org.springframework.security.expression.method.MethodExpressionVoter; import org.springframework.security.expression.method.MethodExpressionVoter;
import org.springframework.security.util.UrlUtils;
import org.springframework.security.vote.AccessDecisionVoter; import org.springframework.security.vote.AccessDecisionVoter;
import org.springframework.security.vote.AffirmativeBased; import org.springframework.security.vote.AffirmativeBased;
import org.springframework.security.vote.AuthenticatedVoter; import org.springframework.security.vote.AuthenticatedVoter;
import org.springframework.security.vote.RoleVoter; import org.springframework.security.vote.RoleVoter;
import org.springframework.security.web.util.UrlUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.w3c.dom.Element; import org.w3c.dom.Element;

@ -18,18 +18,18 @@ import org.springframework.core.OrderComparator;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.config.ConfigUtils.FilterChainList; import org.springframework.security.config.ConfigUtils.FilterChainList;
import org.springframework.security.context.SecurityContextPersistenceFilter; import org.springframework.security.context.web.SecurityContextPersistenceFilter;
import org.springframework.security.intercept.web.DefaultFilterInvocationSecurityMetadataSource; import org.springframework.security.intercept.web.DefaultFilterInvocationSecurityMetadataSource;
import org.springframework.security.intercept.web.FilterSecurityInterceptor; import org.springframework.security.intercept.web.FilterSecurityInterceptor;
import org.springframework.security.providers.anonymous.AnonymousAuthenticationToken; import org.springframework.security.providers.anonymous.AnonymousAuthenticationToken;
import org.springframework.security.providers.anonymous.AnonymousProcessingFilter;
import org.springframework.security.ui.ExceptionTranslationFilter; import org.springframework.security.ui.ExceptionTranslationFilter;
import org.springframework.security.ui.SessionFixationProtectionFilter; import org.springframework.security.ui.SessionFixationProtectionFilter;
import org.springframework.security.ui.anonymous.AnonymousProcessingFilter;
import org.springframework.security.ui.basicauth.BasicProcessingFilter; import org.springframework.security.ui.basicauth.BasicProcessingFilter;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter; import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint; import org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint;
import org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter; import org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter;
import org.springframework.security.util.FilterChainProxy; import org.springframework.security.web.util.FilterChainProxy;
import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter; import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter;
/** /**

@ -20,7 +20,7 @@ import org.springframework.security.ConfigAttribute;
import org.springframework.security.SecurityConfig; import org.springframework.security.SecurityConfig;
import org.springframework.security.expression.method.MethodExpressionAfterInvocationProvider; import org.springframework.security.expression.method.MethodExpressionAfterInvocationProvider;
import org.springframework.security.expression.method.MethodExpressionVoter; import org.springframework.security.expression.method.MethodExpressionVoter;
import org.springframework.security.expression.support.DefaultSecurityExpressionHandler; import org.springframework.security.expression.support.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.intercept.method.DelegatingMethodSecurityMetadataSource; import org.springframework.security.intercept.method.DelegatingMethodSecurityMetadataSource;
import org.springframework.security.intercept.method.MapBasedMethodSecurityMetadataSource; import org.springframework.security.intercept.method.MapBasedMethodSecurityMetadataSource;
import org.springframework.security.intercept.method.ProtectPointcutPostProcessor; import org.springframework.security.intercept.method.ProtectPointcutPostProcessor;
@ -95,7 +95,7 @@ class GlobalMethodSecurityBeanDefinitionParser implements BeanDefinitionParser {
if (StringUtils.hasText(expressionHandlerRef)) { if (StringUtils.hasText(expressionHandlerRef)) {
logger.info("Using bean '" + expressionHandlerRef + "' as method SecurityExpressionHandler implementation"); logger.info("Using bean '" + expressionHandlerRef + "' as method SecurityExpressionHandler implementation");
} else { } else {
parserContext.getRegistry().registerBeanDefinition(EXPRESSION_HANDLER_ID, new RootBeanDefinition(DefaultSecurityExpressionHandler.class)); parserContext.getRegistry().registerBeanDefinition(EXPRESSION_HANDLER_ID, new RootBeanDefinition(DefaultMethodSecurityExpressionHandler.class));
logger.warn("Expressions were enabled for method security but no SecurityExpressionHandler was configured. " + logger.warn("Expressions were enabled for method security but no SecurityExpressionHandler was configured. " +
"All hasPermision() expressions will evaluate to false."); "All hasPermision() expressions will evaluate to false.");
expressionHandlerRef = EXPRESSION_HANDLER_ID; expressionHandlerRef = EXPRESSION_HANDLER_ID;

@ -19,8 +19,8 @@ import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.ConfigAttributeEditor; import org.springframework.security.ConfigAttributeEditor;
import org.springframework.security.SecurityConfig; import org.springframework.security.SecurityConfig;
import org.springframework.security.context.HttpSessionSecurityContextRepository; import org.springframework.security.context.web.HttpSessionSecurityContextRepository;
import org.springframework.security.context.SecurityContextPersistenceFilter; import org.springframework.security.context.web.SecurityContextPersistenceFilter;
import org.springframework.security.expression.web.WebExpressionVoter; import org.springframework.security.expression.web.WebExpressionVoter;
import org.springframework.security.intercept.web.DefaultFilterInvocationSecurityMetadataSource; import org.springframework.security.intercept.web.DefaultFilterInvocationSecurityMetadataSource;
import org.springframework.security.intercept.web.FilterSecurityInterceptor; import org.springframework.security.intercept.web.FilterSecurityInterceptor;
@ -36,12 +36,12 @@ import org.springframework.security.ui.ExceptionTranslationFilter;
import org.springframework.security.ui.SessionFixationProtectionFilter; import org.springframework.security.ui.SessionFixationProtectionFilter;
import org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter; import org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter;
import org.springframework.security.util.AntUrlPathMatcher; import org.springframework.security.util.AntUrlPathMatcher;
import org.springframework.security.util.FilterChainProxy;
import org.springframework.security.util.RegexUrlPathMatcher; import org.springframework.security.util.RegexUrlPathMatcher;
import org.springframework.security.util.UrlMatcher; import org.springframework.security.util.UrlMatcher;
import org.springframework.security.vote.AccessDecisionVoter; import org.springframework.security.vote.AccessDecisionVoter;
import org.springframework.security.vote.AuthenticatedVoter; import org.springframework.security.vote.AuthenticatedVoter;
import org.springframework.security.vote.RoleVoter; import org.springframework.security.vote.RoleVoter;
import org.springframework.security.web.util.FilterChainProxy;
import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter; import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils; import org.springframework.util.xml.DomUtils;
@ -107,7 +107,7 @@ public class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser {
private static final String ATT_DISABLE_URL_REWRITING = "disable-url-rewriting"; private static final String ATT_DISABLE_URL_REWRITING = "disable-url-rewriting";
private static final String EXPRESSION_FIDS_CLASS = "org.springframework.security.expression.web.ExpressionBasedFilterInvocationSecurityMetadataSource"; private static final String EXPRESSION_FIDS_CLASS = "org.springframework.security.expression.web.ExpressionBasedFilterInvocationSecurityMetadataSource";
private static final String EXPRESSION_HANDLER_CLASS = "org.springframework.security.expression.support.DefaultSecurityExpressionHandler"; private static final String EXPRESSION_HANDLER_CLASS = "org.springframework.security.expression.web.support.DefaultWebSecurityExpressionHandler";
private static final String EXPRESSION_HANDLER_ID = "_webExpressionHandler"; private static final String EXPRESSION_HANDLER_ID = "_webExpressionHandler";
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

@ -1,6 +1,6 @@
package org.springframework.security.config; package org.springframework.security.config;
import org.springframework.security.util.PortMapperImpl; import org.springframework.security.web.util.PortMapperImpl;
import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext; import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
@ -15,7 +15,7 @@ import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
/** /**
* Parses a port-mappings element, producing a single {@link org.springframework.security.util.PortMapperImpl} * Parses a port-mappings element, producing a single {@link org.springframework.security.web.util.PortMapperImpl}
* bean. * bean.
* *
* @author Luke Taylor * @author Luke Taylor

@ -26,21 +26,21 @@ import org.springframework.security.concurrent.ConcurrentLoginException;
import org.springframework.security.concurrent.ConcurrentSessionControllerImpl; import org.springframework.security.concurrent.ConcurrentSessionControllerImpl;
import org.springframework.security.concurrent.ConcurrentSessionFilter; import org.springframework.security.concurrent.ConcurrentSessionFilter;
import org.springframework.security.config.util.InMemoryXmlApplicationContext; import org.springframework.security.config.util.InMemoryXmlApplicationContext;
import org.springframework.security.context.HttpSessionSecurityContextRepository;
import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.SecurityContextPersistenceFilter; import org.springframework.security.context.web.HttpSessionSecurityContextRepository;
import org.springframework.security.context.web.SecurityContextPersistenceFilter;
import org.springframework.security.intercept.web.FilterInvocation; import org.springframework.security.intercept.web.FilterInvocation;
import org.springframework.security.intercept.web.FilterInvocationSecurityMetadataSource; import org.springframework.security.intercept.web.FilterInvocationSecurityMetadataSource;
import org.springframework.security.intercept.web.FilterSecurityInterceptor; import org.springframework.security.intercept.web.FilterSecurityInterceptor;
import org.springframework.security.providers.TestingAuthenticationToken; import org.springframework.security.providers.TestingAuthenticationToken;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.providers.anonymous.AnonymousProcessingFilter;
import org.springframework.security.securechannel.ChannelProcessingFilter; import org.springframework.security.securechannel.ChannelProcessingFilter;
import org.springframework.security.ui.AuthenticationFailureHandler; import org.springframework.security.ui.AuthenticationFailureHandler;
import org.springframework.security.ui.AuthenticationSuccessHandler; import org.springframework.security.ui.AuthenticationSuccessHandler;
import org.springframework.security.ui.ExceptionTranslationFilter; import org.springframework.security.ui.ExceptionTranslationFilter;
import org.springframework.security.ui.SessionFixationProtectionFilter; import org.springframework.security.ui.SessionFixationProtectionFilter;
import org.springframework.security.ui.WebAuthenticationDetails; import org.springframework.security.ui.WebAuthenticationDetails;
import org.springframework.security.ui.anonymous.AnonymousProcessingFilter;
import org.springframework.security.ui.basicauth.BasicProcessingFilter; import org.springframework.security.ui.basicauth.BasicProcessingFilter;
import org.springframework.security.ui.logout.LogoutFilter; import org.springframework.security.ui.logout.LogoutFilter;
import org.springframework.security.ui.logout.LogoutHandler; import org.springframework.security.ui.logout.LogoutHandler;
@ -49,9 +49,8 @@ import org.springframework.security.ui.rememberme.PersistentTokenBasedRememberMe
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter; import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
import org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter; import org.springframework.security.ui.webapp.DefaultLoginPageGeneratingFilter;
import org.springframework.security.util.FieldUtils; import org.springframework.security.util.FieldUtils;
import org.springframework.security.util.FilterChainProxy; import org.springframework.security.web.util.FilterChainProxy;
import org.springframework.security.util.MockFilter; import org.springframework.security.web.util.PortMapperImpl;
import org.springframework.security.util.PortMapperImpl;
import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter; import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
@ -341,20 +340,20 @@ public class HttpSecurityBeanDefinitionParserTests {
"<b:bean id='userFilter' class='org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter'>" + "<b:bean id='userFilter' class='org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter'>" +
" <custom-filter after='LOGOUT_FILTER'/>" + " <custom-filter after='LOGOUT_FILTER'/>" +
"</b:bean>" + "</b:bean>" +
"<b:bean id='userFilter1' class='org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter'>" + "<b:bean id='userFilter1' class='org.springframework.security.context.web.SecurityContextPersistenceFilter'>" +
" <custom-filter before='SESSION_CONTEXT_INTEGRATION_FILTER'/>" + " <custom-filter before='SESSION_CONTEXT_INTEGRATION_FILTER'/>" +
"</b:bean>" + "</b:bean>" +
"<b:bean id='userFilter2' class='org.springframework.security.util.MockFilter'>" + "<b:bean id='userFilter2' class='org.springframework.security.context.web.SecurityContextPersistenceFilter'>" +
" <custom-filter position='FIRST'/>" + " <custom-filter position='FIRST'/>" +
"</b:bean>" + "</b:bean>" +
"<b:bean id='userFilter3' class='org.springframework.security.util.MockFilter'/>" + "<b:bean id='userFilter3' class='org.springframework.security.context.web.SecurityContextPersistenceFilter'/>" +
"<b:bean id='userFilter4' class='org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter'/>" "<b:bean id='userFilter4' class='org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter'/>"
); );
List<Filter> filters = getFilters("/someurl"); List<Filter> filters = getFilters("/someurl");
assertEquals(AUTO_CONFIG_FILTERS + 3, filters.size()); assertEquals(AUTO_CONFIG_FILTERS + 3, filters.size());
assertTrue(filters.get(0) instanceof MockFilter); assertTrue(filters.get(0) instanceof SecurityContextPersistenceFilter);
assertTrue(filters.get(1) instanceof SecurityContextHolderAwareRequestFilter); assertTrue(filters.get(1) instanceof SecurityContextPersistenceFilter);
assertTrue(filters.get(4) instanceof SecurityContextHolderAwareRequestFilter); assertTrue(filters.get(4) instanceof SecurityContextHolderAwareRequestFilter);
} }
@ -694,7 +693,7 @@ public class HttpSecurityBeanDefinitionParserTests {
@Test @Test
public void supportsExternallyDefinedSecurityContextRepository() throws Exception { public void supportsExternallyDefinedSecurityContextRepository() throws Exception {
setContext( setContext(
"<b:bean id='repo' class='org.springframework.security.context.HttpSessionSecurityContextRepository'/>" + "<b:bean id='repo' class='org.springframework.security.context.web.HttpSessionSecurityContextRepository'/>" +
"<http create-session='always' security-context-repository-ref='repo'>" + "<http create-session='always' security-context-repository-ref='repo'>" +
" <http-basic />" + " <http-basic />" +
"</http>" + AUTH_PROVIDER_XML); "</http>" + AUTH_PROVIDER_XML);
@ -707,7 +706,7 @@ public class HttpSecurityBeanDefinitionParserTests {
@Test(expected=BeanDefinitionParsingException.class) @Test(expected=BeanDefinitionParsingException.class)
public void cantUseUnsupportedSessionCreationAttributeWithExternallyDefinedSecurityContextRepository() throws Exception { public void cantUseUnsupportedSessionCreationAttributeWithExternallyDefinedSecurityContextRepository() throws Exception {
setContext( setContext(
"<b:bean id='repo' class='org.springframework.security.context.HttpSessionSecurityContextRepository'/>" + "<b:bean id='repo' class='org.springframework.security.context.web.HttpSessionSecurityContextRepository'/>" +
"<http create-session='never' security-context-repository-ref='repo'>" + "<http create-session='never' security-context-repository-ref='repo'>" +
" <http-basic />" + " <http-basic />" +
"</http>" + AUTH_PROVIDER_XML); "</http>" + AUTH_PROVIDER_XML);

@ -16,10 +16,15 @@
package org.springframework.security.util; package org.springframework.security.util;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static org.mockito.Matchers.*;
import java.util.List; import java.util.List;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -29,8 +34,10 @@ import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.security.MockFilterConfig; import org.springframework.security.MockFilterConfig;
import org.springframework.security.context.SecurityContextPersistenceFilter; import org.springframework.security.context.web.SecurityContextPersistenceFilter;
import org.springframework.security.ui.webapp.AuthenticationProcessingFilter; import org.springframework.security.ui.webapp.AuthenticationProcessingFilter;
import org.springframework.security.web.util.FilterChainProxy;
import org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter;
/** /**
* Tests {@link FilterChainProxy}. * Tests {@link FilterChainProxy}.
@ -56,23 +63,6 @@ public class FilterChainProxyConfigTests {
} }
} }
@Test
public void testDoNotFilter() throws Exception {
FilterChainProxy filterChainProxy = (FilterChainProxy) appCtx.getBean("filterChain", FilterChainProxy.class);
MockFilter filter = (MockFilter) appCtx.getBean("mockFilter", MockFilter.class);
MockHttpServletRequest request = new MockHttpServletRequest();
request.setServletPath("/do/not/filter/somefile.html");
MockHttpServletResponse response = new MockHttpServletResponse();
MockFilterChain chain = new MockFilterChain(true);
filterChainProxy.doFilter(request, response, chain);
assertFalse(filter.isWasInitialized());
assertFalse(filter.isWasDoFiltered());
assertFalse(filter.isWasDestroyed());
}
@Test(expected=BeanCreationException.class) @Test(expected=BeanCreationException.class)
public void misplacedUniversalPathShouldBeDetected() throws Exception { public void misplacedUniversalPathShouldBeDetected() throws Exception {
appCtx.getBean("newFilterChainProxyWrongPathOrder", FilterChainProxy.class); appCtx.getBean("newFilterChainProxyWrongPathOrder", FilterChainProxy.class);
@ -126,14 +116,14 @@ public class FilterChainProxyConfigTests {
private void checkPathAndFilterOrder(FilterChainProxy filterChainProxy) throws Exception { private void checkPathAndFilterOrder(FilterChainProxy filterChainProxy) throws Exception {
List<Filter> filters = filterChainProxy.getFilters("/foo/blah"); List<Filter> filters = filterChainProxy.getFilters("/foo/blah");
assertEquals(1, filters.size()); assertEquals(1, filters.size());
assertTrue(filters.get(0) instanceof MockFilter); assertTrue(filters.get(0) instanceof SecurityContextHolderAwareRequestFilter);
filters = filterChainProxy.getFilters("/some/other/path/blah"); filters = filterChainProxy.getFilters("/some/other/path/blah");
assertNotNull(filters); assertNotNull(filters);
assertEquals(3, filters.size()); assertEquals(3, filters.size());
assertTrue(filters.get(0) instanceof SecurityContextPersistenceFilter); assertTrue(filters.get(0) instanceof SecurityContextPersistenceFilter);
assertTrue(filters.get(1) instanceof MockFilter); assertTrue(filters.get(1) instanceof SecurityContextHolderAwareRequestFilter);
assertTrue(filters.get(2) instanceof MockFilter); assertTrue(filters.get(2) instanceof SecurityContextHolderAwareRequestFilter);
filters = filterChainProxy.getFilters("/do/not/filter"); filters = filterChainProxy.getFilters("/do/not/filter");
assertEquals(0, filters.size()); assertEquals(0, filters.size());
@ -142,37 +132,26 @@ public class FilterChainProxyConfigTests {
assertEquals(3, filters.size()); assertEquals(3, filters.size());
assertTrue(filters.get(0) instanceof SecurityContextPersistenceFilter); assertTrue(filters.get(0) instanceof SecurityContextPersistenceFilter);
assertTrue(filters.get(1) instanceof AuthenticationProcessingFilter); assertTrue(filters.get(1) instanceof AuthenticationProcessingFilter);
assertTrue(filters.get(2) instanceof MockFilter); assertTrue(filters.get(2) instanceof SecurityContextHolderAwareRequestFilter);
} }
private void doNormalOperation(FilterChainProxy filterChainProxy) throws Exception { private void doNormalOperation(FilterChainProxy filterChainProxy) throws Exception {
MockFilter filter = (MockFilter) appCtx.getBean("mockFilter", MockFilter.class);
assertFalse(filter.isWasInitialized());
assertFalse(filter.isWasDoFiltered());
assertFalse(filter.isWasDestroyed());
filterChainProxy.init(new MockFilterConfig()); filterChainProxy.init(new MockFilterConfig());
assertTrue(filter.isWasInitialized());
assertFalse(filter.isWasDoFiltered());
assertFalse(filter.isWasDestroyed());
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
request.setServletPath("/foo/secure/super/somefile.html"); request.setServletPath("/foo/secure/super/somefile.html");
MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletResponse response = new MockHttpServletResponse();
MockFilterChain chain = new MockFilterChain(true); FilterChain chain = mock(FilterChain.class);
filterChainProxy.doFilter(request, response, chain); filterChainProxy.doFilter(request, response, chain);
assertTrue(filter.isWasInitialized()); verify(chain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
assertTrue(filter.isWasDoFiltered());
assertFalse(filter.isWasDestroyed());
request.setServletPath("/a/path/which/doesnt/match/any/filter.html"); request.setServletPath("/a/path/which/doesnt/match/any/filter.html");
chain = mock(FilterChain.class);
filterChainProxy.doFilter(request, response, chain); filterChainProxy.doFilter(request, response, chain);
verify(chain).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
filterChainProxy.destroy(); filterChainProxy.destroy();
assertTrue(filter.isWasInitialized());
assertTrue(filter.isWasDoFiltered());
assertTrue(filter.isWasDestroyed());
} }
} }

@ -24,12 +24,12 @@
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"> http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd">
<bean id="mockFilter" class="org.springframework.security.util.MockFilter"/> <bean id="mockFilter" class="org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter"/>
<bean id="mockFilter2" class="org.springframework.security.util.MockFilter"/> <bean id="mockFilter2" class="org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter"/>
<!-- These are just here so we have filters of a specific type to check the ordering is as expected --> <!-- These are just here so we have filters of a specific type to check the ordering is as expected -->
<bean id="sif" class="org.springframework.security.context.SecurityContextPersistenceFilter"/> <bean id="sif" class="org.springframework.security.context.web.SecurityContextPersistenceFilter"/>
<bean id="apf" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter"> <bean id="apf" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager"> <property name="authenticationManager">
@ -39,7 +39,7 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
<bean id="mockNotAFilter" class="org.springframework.security.util.MockNotAFilter"/> <bean id="mockNotAFilter" class="org.springframework.security.util.MockNotAFilter"/>
<bean id="filterChain" class="org.springframework.security.util.FilterChainProxy"> <bean id="filterChain" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="ant"> <sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/foo/**" filters="mockFilter"/> <sec:filter-chain pattern="/foo/**" filters="mockFilter"/>
<sec:filter-chain pattern="/some/other/path/**" filters="mockFilter"/> <sec:filter-chain pattern="/some/other/path/**" filters="mockFilter"/>
@ -48,7 +48,7 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
</bean> </bean>
<!-- TODO: Refactor to replace the above (SEC-1034: 'new' is now the only valid syntax) --> <!-- TODO: Refactor to replace the above (SEC-1034: 'new' is now the only valid syntax) -->
<bean id="newFilterChainProxy" class="org.springframework.security.util.FilterChainProxy"> <bean id="newFilterChainProxy" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="ant"> <sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/foo/**" filters="mockFilter"/> <sec:filter-chain pattern="/foo/**" filters="mockFilter"/>
<sec:filter-chain pattern="/some/other/path/**" filters="sif,mockFilter,mockFilter2"/> <sec:filter-chain pattern="/some/other/path/**" filters="sif,mockFilter,mockFilter2"/>
@ -57,14 +57,14 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
</sec:filter-chain-map> </sec:filter-chain-map>
</bean> </bean>
<bean id="newFilterChainProxyNoDefaultPath" class="org.springframework.security.util.FilterChainProxy"> <bean id="newFilterChainProxyNoDefaultPath" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="ant"> <sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/foo/**" filters="mockFilter"/> <sec:filter-chain pattern="/foo/**" filters="mockFilter"/>
<sec:filter-chain pattern="/*.bar" filters="mockFilter,mockFilter2"/> <sec:filter-chain pattern="/*.bar" filters="mockFilter,mockFilter2"/>
</sec:filter-chain-map> </sec:filter-chain-map>
</bean> </bean>
<bean id="newFilterChainProxyWrongPathOrder" class="org.springframework.security.util.FilterChainProxy"> <bean id="newFilterChainProxyWrongPathOrder" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="ant"> <sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/foo/**" filters="mockFilter"/> <sec:filter-chain pattern="/foo/**" filters="mockFilter"/>
<sec:filter-chain pattern="/**" filters="sif,apf,mockFilter"/> <sec:filter-chain pattern="/**" filters="sif,apf,mockFilter"/>
@ -72,7 +72,7 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
</sec:filter-chain-map> </sec:filter-chain-map>
</bean> </bean>
<bean id="newFilterChainProxyRegex" class="org.springframework.security.util.FilterChainProxy"> <bean id="newFilterChainProxyRegex" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="regex"> <sec:filter-chain-map path-type="regex">
<sec:filter-chain pattern="\A/foo/.*\Z" filters="mockFilter"/> <sec:filter-chain pattern="\A/foo/.*\Z" filters="mockFilter"/>
<sec:filter-chain pattern="\A/s[oO]me/other/path/.*\Z" filters="sif,mockFilter,mockFilter2"/> <sec:filter-chain pattern="\A/s[oO]me/other/path/.*\Z" filters="sif,mockFilter,mockFilter2"/>
@ -81,7 +81,7 @@ http://www.springframework.org/schema/security http://www.springframework.org/sc
</sec:filter-chain-map> </sec:filter-chain-map>
</bean> </bean>
<bean id="newFilterChainProxyNonNamespace" class="org.springframework.security.util.FilterChainProxy"> <bean id="newFilterChainProxyNonNamespace" class="org.springframework.security.web.util.FilterChainProxy">
<property name="matcher"> <property name="matcher">
<bean class="org.springframework.security.util.AntUrlPathMatcher"/> <bean class="org.springframework.security.util.AntUrlPathMatcher"/>
</property> </property>

@ -61,7 +61,7 @@
<dependency> <dependency>
<groupId>cglib</groupId> <groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId> <artifactId>cglib-nodep</artifactId>
<scope>test</scope> <scope>runtime</scope>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency> <dependency>
@ -86,16 +86,19 @@
<artifactId>hsqldb</artifactId> <artifactId>hsqldb</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>jaxen</groupId> <groupId>jaxen</groupId>
<artifactId>jaxen</artifactId> <artifactId>jaxen</artifactId>
<version>1.1.1</version> <version>1.1.1</version>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<!--
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId> <artifactId>servlet-api</artifactId>
</dependency> </dependency>
-->
<dependency> <dependency>
<groupId>org.apache.tomcat</groupId> <groupId>org.apache.tomcat</groupId>
<artifactId>annotations-api</artifactId> <artifactId>annotations-api</artifactId>
@ -110,10 +113,6 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
--> -->
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
</dependency>
<dependency> <dependency>
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>

@ -23,12 +23,14 @@ import java.io.Serializable;
/** /**
* Represents a record of a session within the Spring Security framework. * Represents a record of a session within the Spring Security framework.
* <p>This is primarily used for concurrent session support.</p> * <p>
* <p>Sessions have three states: active, expired, and destroyed. A session can that is invalidated by * This is primarily used for concurrent session support.
* <p>
* Sessions have three states: active, expired, and destroyed. A session can that is invalidated by
* <code>session.invalidate()</code> or via Servlet Container management is considered "destroyed". An "expired" * <code>session.invalidate()</code> or via Servlet Container management is considered "destroyed". An "expired"
* session, on the other hand, is a session that Spring Security wants to end because it was selected for removal for * session, on the other hand, is a session that Spring Security wants to end because it was selected for removal for
* some reason (generally as it was the least recently used session and the maximum sessions for the user were * some reason (generally as it was the least recently used session and the maximum sessions for the user were
* reached). An "expired" session is removed as soon as possible by a <code>Filter</code>.</p> * reached). An "expired" session is removed as soon as possible by a <code>Filter</code>.
* *
* @author Ben Alex * @author Ben Alex
* @version $Id$ * @version $Id$

@ -26,7 +26,7 @@ import org.springframework.util.Assert;
* @version $Id$ * @version $Id$
* *
* @see java.lang.ThreadLocal * @see java.lang.ThreadLocal
* @see org.springframework.security.context.SecurityContextPersistenceFilter * @see org.springframework.security.context.web.SecurityContextPersistenceFilter
*/ */
public class InheritableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy { public class InheritableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {
//~ Static fields/initializers ===================================================================================== //~ Static fields/initializers =====================================================================================

@ -43,7 +43,7 @@ import java.lang.reflect.Constructor;
* @author Ben Alex * @author Ben Alex
* @version $Id$ * @version $Id$
* *
* @see org.springframework.security.context.HttpSessionContextIntegrationFilter * @see org.springframework.security.context.web.HttpSessionContextIntegrationFilter
*/ */
public class SecurityContextHolder { public class SecurityContextHolder {
//~ Static fields/initializers ===================================================================================== //~ Static fields/initializers =====================================================================================
@ -138,7 +138,7 @@ public class SecurityContextHolder {
/** /**
* Delegates the creation of a new, empty context to the configured strategy. * Delegates the creation of a new, empty context to the configured strategy.
*/ */
static SecurityContext createEmptyContext() { public static SecurityContext createEmptyContext() {
return strategy.createEmptyContext(); return strategy.createEmptyContext();
} }

@ -25,7 +25,7 @@ import org.springframework.util.Assert;
* @version $Id$ * @version $Id$
* *
* @see java.lang.ThreadLocal * @see java.lang.ThreadLocal
* @see org.springframework.security.context.SecurityContextPersistenceFilter * @see org.springframework.security.context.web.SecurityContextPersistenceFilter
*/ */
public class ThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy { public class ThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {
//~ Static fields/initializers ===================================================================================== //~ Static fields/initializers =====================================================================================

@ -1,8 +1,7 @@
<html> <html>
<body> <body>
Classes related to the establishment of a security context for the duration of a request (such as Classes related to the establishment of a security context for the duration of a request (such as
an HTTP or RMI invocation) and for the maintenance of the context between requests (by storing it in an HTTP sessio, for an HTTP or RMI invocation).
example).
<p> <p>
A security context is associated with the current execution thread for the duration of the request, making the A security context is associated with the current execution thread for the duration of the request, making the
authentication information it contains available throughout all the layers of an application. authentication information it contains available throughout all the layers of an application.

@ -0,0 +1,18 @@
package org.springframework.security.event;
import org.springframework.context.ApplicationEvent;
/**
* Generic session creation event which indicates that a session (potentially
* represented by a security context) has begun.
*
* @author Luke Taylor
* @version $Id$
* @since 2.5
*/
public abstract class SessionCreationEvent extends ApplicationEvent {
public SessionCreationEvent(Object source) {
super(source);
}
}

@ -0,0 +1,26 @@
package org.springframework.security.event;
import org.springframework.context.ApplicationEvent;
import org.springframework.security.context.SecurityContext;
/**
* Generic "session termination" event which indicates that a session (potentially
* represented by a security context) has ended.
*
* @author Luke Taylor
* @version $Id$
* @since 2.5
*/
public abstract class SessionDestroyedEvent extends ApplicationEvent {
public SessionDestroyedEvent(Object source) {
super(source);
}
/**
* Provides the <tt>SecurityContext</tt> under which the session was running.
*
* @return the <tt>SecurityContext</tt> associated with the session, or null if there is no context.
*/
public abstract SecurityContext getSecurityContext();
}

@ -5,17 +5,16 @@ import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.intercept.web.FilterInvocation;
/** /**
* Facade which isolates Spring Security's requirements from the implementation of the underlying * Facade which isolates Spring Security's requirements for evaluation method-security expressions
* expression objects. * from the implementation of the underlying expression objects.
* *
* @author Luke Taylor * @author Luke Taylor
* @version $Id$ * @version $Id$
* @since 2.5 * @since 2.5
*/ */
public interface SecurityExpressionHandler { public interface MethodSecurityExpressionHandler {
/** /**
* @return an expression parser for the expressions used by the implementation. * @return an expression parser for the expressions used by the implementation.
*/ */
@ -26,11 +25,6 @@ public interface SecurityExpressionHandler {
*/ */
EvaluationContext createEvaluationContext(Authentication authentication, MethodInvocation mi); EvaluationContext createEvaluationContext(Authentication authentication, MethodInvocation mi);
/**
* Provides an evaluation context in which to evaluate security expressions for a web invocation.
*/
EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi);
/** /**
* Filters a target collection or array. * Filters a target collection or array.
* Only applies to method invocations. * Only applies to method invocations.

@ -12,7 +12,7 @@ import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParseException; import org.springframework.expression.ParseException;
import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser; import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.expression.SecurityExpressionHandler; import org.springframework.security.expression.MethodSecurityExpressionHandler;
import org.springframework.security.expression.annotation.PostAuthorize; import org.springframework.security.expression.annotation.PostAuthorize;
import org.springframework.security.expression.annotation.PostFilter; import org.springframework.security.expression.annotation.PostFilter;
import org.springframework.security.expression.annotation.PreAuthorize; import org.springframework.security.expression.annotation.PreAuthorize;
@ -45,10 +45,10 @@ public class ExpressionAnnotationMethodSecurityMetadataSource extends AbstractMe
} }
/** /**
* Constructor which obtains the expression parser from the {@link SecurityExpressionHandler#getExpressionParser() } * Constructor which obtains the expression parser from the {@link MethodSecurityExpressionHandler#getExpressionParser() }
* method on the supplied <tt>SecurityExpressionHandler</tt>. * method on the supplied <tt>SecurityExpressionHandler</tt>.
*/ */
public ExpressionAnnotationMethodSecurityMetadataSource(SecurityExpressionHandler handler) { public ExpressionAnnotationMethodSecurityMetadataSource(MethodSecurityExpressionHandler handler) {
parser = handler.getExpressionParser(); parser = handler.getExpressionParser();
} }

@ -12,8 +12,8 @@ import org.springframework.security.Authentication;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.afterinvocation.AfterInvocationProvider; import org.springframework.security.afterinvocation.AfterInvocationProvider;
import org.springframework.security.expression.ExpressionUtils; import org.springframework.security.expression.ExpressionUtils;
import org.springframework.security.expression.SecurityExpressionHandler; import org.springframework.security.expression.MethodSecurityExpressionHandler;
import org.springframework.security.expression.support.DefaultSecurityExpressionHandler; import org.springframework.security.expression.support.DefaultMethodSecurityExpressionHandler;
/** /**
* AfterInvocationProvider which handles the @PostAuthorize and @PostFilter annotation expressions. * AfterInvocationProvider which handles the @PostAuthorize and @PostFilter annotation expressions.
@ -26,7 +26,7 @@ public class MethodExpressionAfterInvocationProvider implements AfterInvocationP
protected final Log logger = LogFactory.getLog(getClass()); protected final Log logger = LogFactory.getLog(getClass());
private SecurityExpressionHandler expressionHandler = new DefaultSecurityExpressionHandler(); private MethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
public Object decide(Authentication authentication, Object object, List<ConfigAttribute> config, Object returnedObject) public Object decide(Authentication authentication, Object object, List<ConfigAttribute> config, Object returnedObject)
throws AccessDeniedException { throws AccessDeniedException {
@ -90,7 +90,7 @@ public class MethodExpressionAfterInvocationProvider implements AfterInvocationP
return clazz.isAssignableFrom(MethodInvocation.class); return clazz.isAssignableFrom(MethodInvocation.class);
} }
public void setExpressionHandler(SecurityExpressionHandler expressionHandler) { public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandler) {
this.expressionHandler = expressionHandler; this.expressionHandler = expressionHandler;
} }
} }

@ -11,8 +11,8 @@ import org.springframework.expression.Expression;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.expression.ExpressionUtils; import org.springframework.security.expression.ExpressionUtils;
import org.springframework.security.expression.SecurityExpressionHandler; import org.springframework.security.expression.MethodSecurityExpressionHandler;
import org.springframework.security.expression.support.DefaultSecurityExpressionHandler; import org.springframework.security.expression.support.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.vote.AccessDecisionVoter; import org.springframework.security.vote.AccessDecisionVoter;
/** /**
@ -29,7 +29,7 @@ import org.springframework.security.vote.AccessDecisionVoter;
public class MethodExpressionVoter implements AccessDecisionVoter { public class MethodExpressionVoter implements AccessDecisionVoter {
protected final Log logger = LogFactory.getLog(getClass()); protected final Log logger = LogFactory.getLog(getClass());
private SecurityExpressionHandler expressionHandler = new DefaultSecurityExpressionHandler(); private MethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
public boolean supports(ConfigAttribute attribute) { public boolean supports(ConfigAttribute attribute) {
return attribute instanceof AbstractExpressionBasedMethodConfigAttribute; return attribute instanceof AbstractExpressionBasedMethodConfigAttribute;
@ -105,7 +105,7 @@ public class MethodExpressionVoter implements AccessDecisionVoter {
return null; return null;
} }
public void setExpressionHandler(SecurityExpressionHandler expressionHandler) { public void setExpressionHandler(MethodSecurityExpressionHandler expressionHandler) {
this.expressionHandler = expressionHandler; this.expressionHandler = expressionHandler;
} }
} }

@ -14,14 +14,12 @@ import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser; import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationTrustResolver; import org.springframework.security.AuthenticationTrustResolver;
import org.springframework.security.AuthenticationTrustResolverImpl; import org.springframework.security.AuthenticationTrustResolverImpl;
import org.springframework.security.expression.ExpressionUtils; import org.springframework.security.expression.ExpressionUtils;
import org.springframework.security.expression.PermissionEvaluator; import org.springframework.security.expression.PermissionEvaluator;
import org.springframework.security.expression.SecurityExpressionHandler; import org.springframework.security.expression.MethodSecurityExpressionHandler;
import org.springframework.security.intercept.web.FilterInvocation;
/** /**
* The standard implementation of <tt>SecurityExpressionHandler</tt>. * The standard implementation of <tt>SecurityExpressionHandler</tt>.
@ -32,7 +30,7 @@ import org.springframework.security.intercept.web.FilterInvocation;
* @version $Id$ * @version $Id$
* @since 2.5 * @since 2.5
*/ */
public class DefaultSecurityExpressionHandler implements SecurityExpressionHandler { public class DefaultMethodSecurityExpressionHandler implements MethodSecurityExpressionHandler {
protected final Log logger = LogFactory.getLog(getClass()); protected final Log logger = LogFactory.getLog(getClass());
@ -41,7 +39,7 @@ public class DefaultSecurityExpressionHandler implements SecurityExpressionHandl
private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl(); private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
private ExpressionParser expressionParser = new SpelAntlrExpressionParser(); private ExpressionParser expressionParser = new SpelAntlrExpressionParser();
public DefaultSecurityExpressionHandler() { public DefaultMethodSecurityExpressionHandler() {
} }
/** /**
@ -58,15 +56,6 @@ public class DefaultSecurityExpressionHandler implements SecurityExpressionHandl
return ctx; return ctx;
} }
public EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi) {
StandardEvaluationContext ctx = new StandardEvaluationContext();
SecurityExpressionRoot root = new WebSecurityExpressionRoot(authentication, fi);
root.setTrustResolver(trustResolver);
ctx.setRootObject(root);
return ctx;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Object filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx) { public Object filter(Object filterTarget, Expression filterExpression, EvaluationContext ctx) {
MethodSecurityExpressionRoot rootObject = (MethodSecurityExpressionRoot) ctx.getRootObject(); MethodSecurityExpressionRoot rootObject = (MethodSecurityExpressionRoot) ctx.getRootObject();

@ -15,7 +15,7 @@ import org.springframework.security.util.AuthorityUtils;
* @version $Id$ * @version $Id$
* @since 2.5 * @since 2.5
*/ */
abstract class SecurityExpressionRoot { public abstract class SecurityExpressionRoot {
protected final Authentication authentication; protected final Authentication authentication;
private AuthenticationTrustResolver trustResolver; private AuthenticationTrustResolver trustResolver;
/** Allows "permitAll" expression */ /** Allows "permitAll" expression */
@ -24,7 +24,7 @@ abstract class SecurityExpressionRoot {
/** Allows "denyAll" expression */ /** Allows "denyAll" expression */
public final boolean denyAll = false; public final boolean denyAll = false;
SecurityExpressionRoot(Authentication a) { public SecurityExpressionRoot(Authentication a) {
if (a == null) { if (a == null) {
throw new IllegalArgumentException("Authentication object cannot be null"); throw new IllegalArgumentException("Authentication object cannot be null");
} }

@ -41,13 +41,12 @@ import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationException; import org.springframework.security.AuthenticationException;
import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthority;
import org.springframework.security.SpringSecurityException; import org.springframework.security.SpringSecurityException;
import org.springframework.security.context.HttpSessionSecurityContextRepository;
import org.springframework.security.context.SecurityContext; import org.springframework.security.context.SecurityContext;
import org.springframework.security.event.SessionDestroyedEvent;
import org.springframework.security.providers.AuthenticationProvider; import org.springframework.security.providers.AuthenticationProvider;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.providers.jaas.event.JaasAuthenticationFailedEvent; import org.springframework.security.providers.jaas.event.JaasAuthenticationFailedEvent;
import org.springframework.security.providers.jaas.event.JaasAuthenticationSuccessEvent; import org.springframework.security.providers.jaas.event.JaasAuthenticationSuccessEvent;
import org.springframework.security.ui.session.HttpSessionDestroyedEvent;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -311,9 +310,8 @@ public class JaasAuthenticationProvider implements AuthenticationProvider, Appli
* *
* @param event * @param event
*/ */
protected void handleLogout(HttpSessionDestroyedEvent event) { protected void handleLogout(SessionDestroyedEvent event) {
SecurityContext context = (SecurityContext) SecurityContext context = event.getSecurityContext();
event.getSession().getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
if (context == null) { if (context == null) {
log.debug("The destroyed session has no SecurityContext"); log.debug("The destroyed session has no SecurityContext");
@ -343,8 +341,8 @@ public class JaasAuthenticationProvider implements AuthenticationProvider, Appli
} }
public void onApplicationEvent(ApplicationEvent applicationEvent) { public void onApplicationEvent(ApplicationEvent applicationEvent) {
if (applicationEvent instanceof HttpSessionDestroyedEvent) { if (applicationEvent instanceof SessionDestroyedEvent) {
HttpSessionDestroyedEvent event = (HttpSessionDestroyedEvent) applicationEvent; SessionDestroyedEvent event = (SessionDestroyedEvent) applicationEvent;
handleLogout(event); handleLogout(event);
} }
} }

@ -22,7 +22,7 @@ import org.springframework.util.Assert;
* *
* <p> * <p>
* This authentication provider will not perform any checks on authentication * This authentication provider will not perform any checks on authentication
* requests, as they should already be pre- authenticated. However, the * requests, as they should already be pre-authenticated. However, the
* AuthenticationUserDetailsService implementation may still throw a UsernameNotFoundException, for example. * AuthenticationUserDetailsService implementation may still throw a UsernameNotFoundException, for example.
* *
* @author Ruud Senden * @author Ruud Senden

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.security.context.httpinvoker; package org.springframework.security.remoting.httpinvoker;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationCredentialsNotFoundException; import org.springframework.security.AuthenticationCredentialsNotFoundException;

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.security.context.rmi; package org.springframework.security.remoting.rmi;
import org.springframework.security.context.SecurityContext; import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextHolder;

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.security.context.rmi; package org.springframework.security.remoting.rmi;
import org.aopalliance.intercept.MethodInvocation; import org.aopalliance.intercept.MethodInvocation;

@ -1,50 +0,0 @@
/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.security.ui.session;
import org.springframework.context.ApplicationEvent;
import javax.servlet.http.HttpSession;
/**
* Parent class for published HttpSession events
*
* @author Ray Krueger
*/
public abstract class HttpSessionApplicationEvent extends ApplicationEvent {
//~ Constructors ===================================================================================================
/**
* Base constructor for all subclasses must have an HttpSession
*
* @param httpSession The session to carry as the event source.
*/
public HttpSessionApplicationEvent(HttpSession httpSession) {
super(httpSession);
}
//~ Methods ========================================================================================================
/**
* Get the HttpSession that is the cause of the event
*
* @return HttpSession instance
*/
public HttpSession getSession() {
return (HttpSession) getSource();
}
}

@ -25,7 +25,6 @@ import org.springframework.security.AccessDeniedException;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.SecurityConfig; import org.springframework.security.SecurityConfig;
import org.springframework.security.intercept.web.FilterInvocation;
import org.springframework.security.util.SimpleMethodInvocation; import org.springframework.security.util.SimpleMethodInvocation;
@ -129,7 +128,7 @@ public class AfterInvocationProviderManagerTests extends TestCase {
manager.setProviders(list); manager.setProviders(list);
manager.afterPropertiesSet(); manager.afterPropertiesSet();
assertFalse(manager.supports(FilterInvocation.class)); // assertFalse(manager.supports(FilterInvocation.class));
assertTrue(manager.supports(MethodInvocation.class)); assertTrue(manager.supports(MethodInvocation.class));
} }

@ -15,10 +15,8 @@
package org.springframework.security.providers; package org.springframework.security.providers;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.*;
import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -32,7 +30,7 @@ import org.springframework.security.AuthenticationServiceException;
import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthority;
import org.springframework.security.MockApplicationEventPublisher; import org.springframework.security.MockApplicationEventPublisher;
import org.springframework.security.concurrent.ConcurrentLoginException; import org.springframework.security.concurrent.ConcurrentLoginException;
import org.springframework.security.concurrent.ConcurrentSessionControllerImpl; import org.springframework.security.concurrent.ConcurrentSessionController;
import org.springframework.security.concurrent.NullConcurrentSessionController; import org.springframework.security.concurrent.NullConcurrentSessionController;
import org.springframework.security.util.AuthorityUtils; import org.springframework.security.util.AuthorityUtils;
@ -102,9 +100,9 @@ public class ProviderManagerTests {
assertNotNull(target.getSessionController()); assertNotNull(target.getSessionController());
assertTrue(target.getSessionController() instanceof NullConcurrentSessionController); assertTrue(target.getSessionController() instanceof NullConcurrentSessionController);
ConcurrentSessionControllerImpl impl = new ConcurrentSessionControllerImpl(); ConcurrentSessionController csc = mock(ConcurrentSessionController.class);
target.setSessionController(impl); target.setSessionController(csc);
assertEquals(impl, target.getSessionController()); assertEquals(csc, target.getSessionController());
} }
@Test(expected=IllegalArgumentException.class) @Test(expected=IllegalArgumentException.class)

@ -15,6 +15,8 @@
package org.springframework.security.providers.jaas; package org.springframework.security.providers.jaas;
import static org.mockito.Mockito.*;
import java.net.URL; import java.net.URL;
import java.security.Security; import java.security.Security;
import java.util.List; import java.util.List;
@ -26,18 +28,16 @@ import junit.framework.TestCase;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mock.web.MockHttpSession;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationException; import org.springframework.security.AuthenticationException;
import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl; import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.LockedException; import org.springframework.security.LockedException;
import org.springframework.security.SpringSecurityException; import org.springframework.security.SpringSecurityException;
import org.springframework.security.context.HttpSessionSecurityContextRepository;
import org.springframework.security.context.SecurityContextImpl; import org.springframework.security.context.SecurityContextImpl;
import org.springframework.security.event.SessionDestroyedEvent;
import org.springframework.security.providers.TestingAuthenticationToken; import org.springframework.security.providers.TestingAuthenticationToken;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.ui.session.HttpSessionDestroyedEvent;
import org.springframework.security.util.AuthorityUtils; import org.springframework.security.util.AuthorityUtils;
@ -204,10 +204,10 @@ public class JaasAuthenticationProviderTests extends TestCase {
SecurityContextImpl context = new SecurityContextImpl(); SecurityContextImpl context = new SecurityContextImpl();
context.setAuthentication(token); context.setAuthentication(token);
MockHttpSession mockSession = new MockHttpSession(); SessionDestroyedEvent event = mock(SessionDestroyedEvent.class);
mockSession.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, context); when(event.getSecurityContext()).thenReturn(context);
jaasProvider.onApplicationEvent(new HttpSessionDestroyedEvent(mockSession)); jaasProvider.handleLogout(event);
assertTrue(loginContext.loggedOut); assertTrue(loginContext.loggedOut);
} }

@ -13,16 +13,16 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.security.context.httpinvoker; package org.springframework.security.remoting.httpinvoker;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.httpinvoker.AuthenticationSimpleHttpInvokerRequestExecutor;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.remoting.httpinvoker.AuthenticationSimpleHttpInvokerRequestExecutor;
import java.io.IOException; import java.io.IOException;

@ -13,7 +13,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.security.context.rmi; package org.springframework.security.remoting.rmi;
import junit.framework.TestCase; import junit.framework.TestCase;
@ -23,6 +23,8 @@ import org.springframework.security.TargetObject;
import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.remoting.rmi.ContextPropagatingRemoteInvocation;
import org.springframework.security.remoting.rmi.ContextPropagatingRemoteInvocationFactory;
import org.springframework.security.util.SimpleMethodInvocation; import org.springframework.security.util.SimpleMethodInvocation;

@ -1,56 +0,0 @@
/* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.security.util;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.junit.Assert;
/**
* A mock <code>FilterChain</code>.
*
* @author Ben Alex
* @version $Id$
*/
public class MockFilterChain implements FilterChain {
//~ Instance fields ================================================================================================
private boolean expectToProceed;
//~ Constructors ===================================================================================================
public MockFilterChain() {
this(true);
}
public MockFilterChain(boolean expectToProceed) {
this.expectToProceed = expectToProceed;
}
//~ Methods ========================================================================================================
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
if (!expectToProceed) {
Assert.fail("Did not expect filter chain to proceed");
}
}
}

@ -18,10 +18,10 @@ import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockHttpSession; import org.springframework.mock.web.MockHttpSession;
import org.springframework.security.GrantedAuthority; import org.springframework.security.GrantedAuthority;
import org.springframework.security.GrantedAuthorityImpl; import org.springframework.security.GrantedAuthorityImpl;
import org.springframework.security.context.HttpSessionSecurityContextRepository;
import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.web.HttpSessionSecurityContextRepository;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.util.FilterChainProxy; import org.springframework.security.web.util.FilterChainProxy;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.StopWatch; import org.springframework.util.StopWatch;

@ -11,13 +11,13 @@
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
<bean id="fcpMinimalStack" class="org.springframework.security.util.FilterChainProxy"> <bean id="fcpMinimalStack" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="ant"> <sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/**" filters="scpf,preAuthFilter,etf,fsi"/> <sec:filter-chain pattern="/**" filters="scpf,preAuthFilter,etf,fsi"/>
</sec:filter-chain-map> </sec:filter-chain-map>
</bean> </bean>
<bean id="fcpFullStack" class="org.springframework.security.util.FilterChainProxy"> <bean id="fcpFullStack" class="org.springframework.security.web.util.FilterChainProxy">
<sec:filter-chain-map path-type="ant"> <sec:filter-chain-map path-type="ant">
<sec:filter-chain pattern="/**" filters="scpf,preAuthFilter,apf,basicPf,logoutFilter,scharf,etf,fsi"/> <sec:filter-chain pattern="/**" filters="scpf,preAuthFilter,apf,basicPf,logoutFilter,scharf,etf,fsi"/>
</sec:filter-chain-map> </sec:filter-chain-map>
@ -37,7 +37,7 @@
<sec:user name="bob" password="bobspassword" authorities="ROLE_0,ROLE_1"/> <sec:user name="bob" password="bobspassword" authorities="ROLE_0,ROLE_1"/>
</sec:user-service> </sec:user-service>
<bean id="scpf" class="org.springframework.security.context.SecurityContextPersistenceFilter"/> <bean id="scpf" class="org.springframework.security.context.web.SecurityContextPersistenceFilter"/>
<bean id="apf" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter"> <bean id="apf" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationManager" ref="authenticationManager"/>

@ -51,10 +51,6 @@
<scope>runtime</scope> <scope>runtime</scope>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
</dependency>
<dependency> <dependency>
<groupId>log4j</groupId> <groupId>log4j</groupId>
<artifactId>log4j</artifactId> <artifactId>log4j</artifactId>

@ -15,11 +15,16 @@
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId> <artifactId>spring-security-ldap</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- SMT NTLM--> <!-- SMT NTLM-->
<dependency> <dependency>
<groupId>org.samba.jcifs</groupId> <groupId>org.samba.jcifs</groupId>

@ -14,7 +14,7 @@
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-web</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>

@ -1,16 +1,22 @@
package org.springframework.security.ui.openid; package org.springframework.security.ui.openid;
import junit.framework.TestCase; import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.security.MockAuthenticationManager; import org.springframework.security.MockAuthenticationManager;
import org.springframework.security.ui.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.ui.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.ui.openid.consumers.MockOpenIDConsumer; import org.springframework.security.ui.openid.consumers.MockOpenIDConsumer;
import org.springframework.security.util.MockFilterChain;
import javax.servlet.http.HttpServletRequest; public class OpenIDAuthenticationProcessingFilterTests {
public class OpenIDAuthenticationProcessingFilterTests extends TestCase {
OpenIDAuthenticationProcessingFilter filter; OpenIDAuthenticationProcessingFilter filter;
private static final String REDIRECT_URL = "http://www.example.com/redirect"; private static final String REDIRECT_URL = "http://www.example.com/redirect";
@ -19,7 +25,8 @@ public class OpenIDAuthenticationProcessingFilterTests extends TestCase {
private static final String FILTER_PROCESS_URL = "http://localhost:80" + REQUEST_PATH; private static final String FILTER_PROCESS_URL = "http://localhost:80" + REQUEST_PATH;
private static final String DEFAULT_TARGET_URL = FILTER_PROCESS_URL; private static final String DEFAULT_TARGET_URL = FILTER_PROCESS_URL;
protected void setUp() throws Exception { @Before
public void setUp() throws Exception {
filter = new OpenIDAuthenticationProcessingFilter(); filter = new OpenIDAuthenticationProcessingFilter();
filter.setConsumer(new MockOpenIDConsumer(REDIRECT_URL)); filter.setConsumer(new MockOpenIDConsumer(REDIRECT_URL));
SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
@ -29,6 +36,7 @@ public class OpenIDAuthenticationProcessingFilterTests extends TestCase {
filter.afterPropertiesSet(); filter.afterPropertiesSet();
} }
@Test
public void testFilterOperation() throws Exception { public void testFilterOperation() throws Exception {
MockHttpServletRequest req = new MockHttpServletRequest("GET", REQUEST_PATH); MockHttpServletRequest req = new MockHttpServletRequest("GET", REQUEST_PATH);
MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletResponse response = new MockHttpServletResponse();
@ -45,9 +53,10 @@ public class OpenIDAuthenticationProcessingFilterTests extends TestCase {
} }
}); });
filter.doFilter(req, response, new MockFilterChain(false)); FilterChain fc = mock(FilterChain.class);
filter.doFilter(req, response, fc);
assertEquals(REDIRECT_URL, response.getRedirectedUrl()); assertEquals(REDIRECT_URL, response.getRedirectedUrl());
// Filter chain shouldn't proceed
verify(fc, never()).doFilter(any(HttpServletRequest.class), any(HttpServletResponse.class));
} }
} }

14
pom.xml

@ -9,7 +9,7 @@
<modules> <modules>
<module>core</module> <module>core</module>
<!-- module>web</module --> <module>web</module>
<module>ldap</module> <module>ldap</module>
<module>config</module> <module>config</module>
<module>acl</module> <module>acl</module>
@ -300,6 +300,12 @@
<artifactId>mockito-core</artifactId> <artifactId>mockito-core</artifactId>
<version>1.7</version> <version>1.7</version>
</dependency> </dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
<version>2.5.1</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
@ -814,12 +820,6 @@
<version>1.8.0.7</version> <version>1.8.0.7</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
<version>2.5.1</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>commons-logging</groupId> <groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId> <artifactId>commons-logging</artifactId>

@ -39,7 +39,6 @@ import org.springframework.security.providers.TestingAuthenticationToken;
import org.springframework.security.providers.UsernamePasswordAuthenticationToken; import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
import org.springframework.security.providers.portlet.PortletTestUtils; import org.springframework.security.providers.portlet.PortletTestUtils;
import org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.providers.preauth.PreAuthenticatedAuthenticationToken;
import org.springframework.security.ui.AbstractProcessingFilter;
import org.springframework.security.userdetails.User; import org.springframework.security.userdetails.User;
import org.springframework.security.util.AuthorityUtils; import org.springframework.security.util.AuthorityUtils;
@ -52,6 +51,7 @@ import org.springframework.security.util.AuthorityUtils;
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class PortletProcessingInterceptorTests { public class PortletProcessingInterceptorTests {
public static final String SPRING_SECURITY_LAST_EXCEPTION_KEY = "SPRING_SECURITY_LAST_EXCEPTION";
//~ Methods ======================================================================================================== //~ Methods ========================================================================================================
@Before @Before

@ -48,7 +48,7 @@
<b:property name="targetUrl" value="/secure/index.htm"/> <b:property name="targetUrl" value="/secure/index.htm"/>
</b:bean> </b:bean>
<b:bean id="expressionHandler" class="org.springframework.security.expression.support.DefaultSecurityExpressionHandler"> <b:bean id="expressionHandler" class="org.springframework.security.expression.support.DefaultMethodSecurityExpressionHandler">
<b:property name="permissionEvaluator" ref="permissionEvaluator" /> <b:property name="permissionEvaluator" ref="permissionEvaluator" />
</b:bean> </b:bean>

@ -24,7 +24,7 @@
<jdbc-user-service data-source-ref="dataSource"/> <jdbc-user-service data-source-ref="dataSource"/>
</authentication-provider> </authentication-provider>
<b:bean id="expressionHandler" class="org.springframework.security.expression.support.DefaultSecurityExpressionHandler"> <b:bean id="expressionHandler" class="org.springframework.security.expression.support.DefaultMethodSecurityExpressionHandler">
<b:property name="permissionEvaluator" ref="permissionEvaluator" /> <b:property name="permissionEvaluator" ref="permissionEvaluator" />
</b:bean> </b:bean>

@ -59,8 +59,8 @@ public class DocumentDaoImpl extends JdbcDaoSupport implements DocumentDao {
/** Executes recursive SQL as needed to build a full Directory hierarchy of objects */ /** Executes recursive SQL as needed to build a full Directory hierarchy of objects */
private Directory getDirectoryWithImmediateParentPopulated(final Long id) { private Directory getDirectoryWithImmediateParentPopulated(final Long id) {
return (Directory) getJdbcTemplate().queryForObject(SELECT_FROM_DIRECTORY_SINGLE, new Object[] {id}, new RowMapper() { return getJdbcTemplate().queryForObject(SELECT_FROM_DIRECTORY_SINGLE, new Object[] {id}, new RowMapper<Directory>() {
public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { public Directory mapRow(ResultSet rs, int rowNumber) throws SQLException {
Long parentDirectoryId = new Long(rs.getLong("parent_directory_id")); Long parentDirectoryId = new Long(rs.getLong("parent_directory_id"));
Directory parentDirectory = Directory.ROOT_DIRECTORY; Directory parentDirectory = Directory.ROOT_DIRECTORY;
if (parentDirectoryId != null && !parentDirectoryId.equals(new Long(-1))) { if (parentDirectoryId != null && !parentDirectoryId.equals(new Long(-1))) {
@ -77,20 +77,20 @@ public class DocumentDaoImpl extends JdbcDaoSupport implements DocumentDao {
public AbstractElement[] findElements(Directory directory) { public AbstractElement[] findElements(Directory directory) {
Assert.notNull(directory, "Directory required (the ID can be null to refer to root)"); Assert.notNull(directory, "Directory required (the ID can be null to refer to root)");
if (directory.getId() == null) { if (directory.getId() == null) {
List directories = getJdbcTemplate().query(SELECT_FROM_DIRECTORY_NULL, new RowMapper() { List<Directory> directories = getJdbcTemplate().query(SELECT_FROM_DIRECTORY_NULL, new RowMapper<Directory>() {
public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { public Directory mapRow(ResultSet rs, int rowNumber) throws SQLException {
return getDirectoryWithImmediateParentPopulated(new Long(rs.getLong("id"))); return getDirectoryWithImmediateParentPopulated(new Long(rs.getLong("id")));
} }
}); });
return (AbstractElement[]) directories.toArray(new AbstractElement[] {}); return (AbstractElement[]) directories.toArray(new AbstractElement[] {});
} }
List directories = getJdbcTemplate().query(SELECT_FROM_DIRECTORY, new Object[] {directory.getId()}, new RowMapper() { List<AbstractElement> directories = getJdbcTemplate().query(SELECT_FROM_DIRECTORY, new Object[] {directory.getId()}, new RowMapper<AbstractElement>() {
public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { public Directory mapRow(ResultSet rs, int rowNumber) throws SQLException {
return getDirectoryWithImmediateParentPopulated(new Long(rs.getLong("id"))); return getDirectoryWithImmediateParentPopulated(new Long(rs.getLong("id")));
} }
}); });
List files = getJdbcTemplate().query(SELECT_FROM_FILE, new Object[] {directory.getId()}, new RowMapper() { List<File> files = getJdbcTemplate().query(SELECT_FROM_FILE, new Object[] {directory.getId()}, new RowMapper<File>() {
public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { public File mapRow(ResultSet rs, int rowNumber) throws SQLException {
Long parentDirectoryId = new Long(rs.getLong("parent_directory_id")); Long parentDirectoryId = new Long(rs.getLong("parent_directory_id"));
Directory parentDirectory = null; Directory parentDirectory = null;
if (parentDirectoryId != null) { if (parentDirectoryId != null) {

@ -50,8 +50,6 @@
<property name="providers"> <property name="providers">
<list> <list>
<ref local="daoAuthenticationProvider"/> <ref local="daoAuthenticationProvider"/>
<ref local="anonymousAuthenticationProvider"/>
<ref local="rememberMeAuthenticationProvider"/>
</list> </list>
</property> </property>
</bean> </bean>
@ -81,13 +79,11 @@
<!-- Automatically receives AuthenticationEvent messages --> <!-- Automatically receives AuthenticationEvent messages -->
<bean id="loggerListener" class="org.springframework.security.event.authentication.LoggerListener"/> <bean id="loggerListener" class="org.springframework.security.event.authentication.LoggerListener"/>
<!--
<bean id="anonymousAuthenticationProvider" class="org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider"> <bean id="anonymousAuthenticationProvider" class="org.springframework.security.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key" value="foobar"/> <property name="key" value="foobar"/>
</bean> </bean>
<bean id="httpSessionContextIntegrationFilter" class="org.springframework.security.context.HttpSessionContextIntegrationFilter"/>
<bean id="rememberMeServices" class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices"> <bean id="rememberMeServices" class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="jdbcDaoImpl"/> <property name="userDetailsService" ref="jdbcDaoImpl"/>
<property name="key" value="springRocks"/> <property name="key" value="springRocks"/>
@ -96,7 +92,7 @@
<bean id="rememberMeAuthenticationProvider" class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider"> <bean id="rememberMeAuthenticationProvider" class="org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/> <property name="key" value="springRocks"/>
</bean> </bean>
-->
<!-- ========================= "BEFORE INVOCATION" AUTHORIZATION DEFINITIONS ============================== --> <!-- ========================= "BEFORE INVOCATION" AUTHORIZATION DEFINITIONS ============================== -->
<!-- ACL permission masks used by this application --> <!-- ACL permission masks used by this application -->

@ -16,7 +16,7 @@
<module>preauth</module> <module>preauth</module>
<module>openid</module> <module>openid</module>
<module>ldap</module> <module>ldap</module>
<module>portlet</module> <!-- module>portlet</module -->
<module>cas</module> <module>cas</module>
</modules> </modules>
<dependencies> <dependencies>

@ -17,6 +17,11 @@
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.security</groupId> <groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>

@ -43,10 +43,6 @@
<artifactId>standard</artifactId> <artifactId>standard</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.jmock</groupId>
<artifactId>jmock-junit4</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<resources> <resources>

57
web/pom.xml Normal file

@ -0,0 +1,57 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-parent</artifactId>
<version>2.5.0-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>
<artifactId>spring-security-web</artifactId>
<name>Spring Security - Web Application Security Module</name>
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web</artifactId>
<!-- optional>true</optional -->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.jdbc</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.test</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
</dependencies>
</project>

@ -21,7 +21,7 @@ import org.springframework.security.ui.FilterChainOrder;
import org.springframework.security.ui.SpringSecurityFilter; import org.springframework.security.ui.SpringSecurityFilter;
import org.springframework.security.ui.logout.LogoutHandler; import org.springframework.security.ui.logout.LogoutHandler;
import org.springframework.security.ui.logout.SecurityContextLogoutHandler; import org.springframework.security.ui.logout.SecurityContextLogoutHandler;
import org.springframework.security.util.UrlUtils; import org.springframework.security.web.util.UrlUtils;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert; import org.springframework.util.Assert;

@ -0,0 +1,6 @@
<html>
<body>
Concurrent session control and registration classes.
</body>
</html>

@ -1,4 +1,4 @@
package org.springframework.security.context; package org.springframework.security.context.web;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;

@ -13,11 +13,14 @@
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.security.context; package org.springframework.security.context.web;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.SecurityContextImpl;
import org.springframework.security.ui.FilterChainOrder; import org.springframework.security.ui.FilterChainOrder;
/** /**

@ -1,4 +1,4 @@
package org.springframework.security.context; package org.springframework.security.context.web;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -10,6 +10,10 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.security.AuthenticationTrustResolver; import org.springframework.security.AuthenticationTrustResolver;
import org.springframework.security.AuthenticationTrustResolverImpl; import org.springframework.security.AuthenticationTrustResolverImpl;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.context.SecurityContextHolderStrategy;
import org.springframework.security.context.SecurityContextImpl;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;

@ -1,10 +1,13 @@
package org.springframework.security.context; package org.springframework.security.context.web;
import java.io.IOException; import java.io.IOException;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; import javax.servlet.http.HttpServletResponseWrapper;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
/** /**
* Base class for response wrappers which encapsulate the logic for storing a security context and which * Base class for response wrappers which encapsulate the logic for storing a security context and which
* store the with the <code>SecurityContext</code> when a <code>sendError()</code> or <code>sendRedirect</code> * store the with the <code>SecurityContext</code> when a <code>sendError()</code> or <code>sendRedirect</code>

@ -1,4 +1,4 @@
package org.springframework.security.context; package org.springframework.security.context.web;
import java.io.IOException; import java.io.IOException;
@ -8,6 +8,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.ui.FilterChainOrder; import org.springframework.security.ui.FilterChainOrder;
import org.springframework.security.ui.SpringSecurityFilter; import org.springframework.security.ui.SpringSecurityFilter;

@ -1,8 +1,10 @@
package org.springframework.security.context; package org.springframework.security.context.web;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.context.SecurityContext;
/** /**
* Strategy used for persisting a {@link SecurityContext} between requests. * Strategy used for persisting a {@link SecurityContext} between requests.
* <p> * <p>
@ -43,7 +45,7 @@ public interface SecurityContextRepository {
/** /**
* Stores the security context on completion of a request. * Stores the security context on completion of a request.
* *
* @param context the non-null context which was obtained f * @param context the non-null context which was obtained from the holder.
* @param request * @param request
* @param response * @param response
*/ */

@ -10,7 +10,6 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParseException; import org.springframework.expression.ParseException;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.expression.SecurityExpressionHandler;
import org.springframework.security.intercept.web.DefaultFilterInvocationSecurityMetadataSource; import org.springframework.security.intercept.web.DefaultFilterInvocationSecurityMetadataSource;
import org.springframework.security.intercept.web.RequestKey; import org.springframework.security.intercept.web.RequestKey;
import org.springframework.security.util.UrlMatcher; import org.springframework.security.util.UrlMatcher;
@ -27,7 +26,7 @@ public final class ExpressionBasedFilterInvocationSecurityMetadataSource extends
private final static Log logger = LogFactory.getLog(ExpressionBasedFilterInvocationSecurityMetadataSource.class); private final static Log logger = LogFactory.getLog(ExpressionBasedFilterInvocationSecurityMetadataSource.class);
public ExpressionBasedFilterInvocationSecurityMetadataSource(UrlMatcher urlMatcher, public ExpressionBasedFilterInvocationSecurityMetadataSource(UrlMatcher urlMatcher,
LinkedHashMap<RequestKey, List<ConfigAttribute>> requestMap, SecurityExpressionHandler expressionHandler) { LinkedHashMap<RequestKey, List<ConfigAttribute>> requestMap, WebSecurityExpressionHandler expressionHandler) {
super(urlMatcher, processMap(requestMap, expressionHandler.getExpressionParser())); super(urlMatcher, processMap(requestMap, expressionHandler.getExpressionParser()));
Assert.notNull(expressionHandler, "A non-null SecurityExpressionHandler is required"); Assert.notNull(expressionHandler, "A non-null SecurityExpressionHandler is required");
} }

@ -6,8 +6,9 @@ import org.springframework.expression.EvaluationContext;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.ConfigAttribute; import org.springframework.security.ConfigAttribute;
import org.springframework.security.expression.ExpressionUtils; import org.springframework.security.expression.ExpressionUtils;
import org.springframework.security.expression.SecurityExpressionHandler; import org.springframework.security.expression.MethodSecurityExpressionHandler;
import org.springframework.security.expression.support.DefaultSecurityExpressionHandler; import org.springframework.security.expression.support.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.expression.web.support.DefaultWebSecurityExpressionHandler;
import org.springframework.security.intercept.web.FilterInvocation; import org.springframework.security.intercept.web.FilterInvocation;
import org.springframework.security.vote.AccessDecisionVoter; import org.springframework.security.vote.AccessDecisionVoter;
@ -18,7 +19,7 @@ import org.springframework.security.vote.AccessDecisionVoter;
* @since 2.5 * @since 2.5
*/ */
public class WebExpressionVoter implements AccessDecisionVoter { public class WebExpressionVoter implements AccessDecisionVoter {
private SecurityExpressionHandler expressionHandler = new DefaultSecurityExpressionHandler(); private WebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
public int vote(Authentication authentication, Object object, List<ConfigAttribute> attributes) { public int vote(Authentication authentication, Object object, List<ConfigAttribute> attributes) {
assert authentication != null; assert authentication != null;
@ -55,7 +56,7 @@ public class WebExpressionVoter implements AccessDecisionVoter {
return clazz.isAssignableFrom(FilterInvocation.class); return clazz.isAssignableFrom(FilterInvocation.class);
} }
public void setExpressionHandler(SecurityExpressionHandler expressionHandler) { public void setExpressionHandler(WebSecurityExpressionHandler expressionHandler) {
this.expressionHandler = expressionHandler; this.expressionHandler = expressionHandler;
} }
} }

@ -0,0 +1,19 @@
package org.springframework.security.expression.web;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.security.Authentication;
import org.springframework.security.intercept.web.FilterInvocation;
public interface WebSecurityExpressionHandler {
/**
* @return an expression parser for the expressions used by the implementation.
*/
ExpressionParser getExpressionParser();
/**
* Provides an evaluation context in which to evaluate security expressions for a web invocation.
*/
EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi);
}

@ -0,0 +1,39 @@
package org.springframework.security.expression.web.support;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.antlr.SpelAntlrExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.security.Authentication;
import org.springframework.security.AuthenticationTrustResolver;
import org.springframework.security.AuthenticationTrustResolverImpl;
import org.springframework.security.expression.support.SecurityExpressionRoot;
import org.springframework.security.expression.web.WebSecurityExpressionHandler;
import org.springframework.security.intercept.web.FilterInvocation;
/**
* Facade which isolates Spring Security's requirements for evaluating web-security expressions
* from the implementation of the underlying expression objects.
*
* @author Luke Taylor
* @version $Id$
* @since 2.5
*/
public class DefaultWebSecurityExpressionHandler implements WebSecurityExpressionHandler {
private AuthenticationTrustResolver trustResolver = new AuthenticationTrustResolverImpl();
private ExpressionParser expressionParser = new SpelAntlrExpressionParser();
public ExpressionParser getExpressionParser() {
return expressionParser;
}
public EvaluationContext createEvaluationContext(Authentication authentication, FilterInvocation fi) {
StandardEvaluationContext ctx = new StandardEvaluationContext();
SecurityExpressionRoot root = new WebSecurityExpressionRoot(authentication, fi);
root.setTrustResolver(trustResolver);
ctx.setRootObject(root);
return ctx;
}
}

@ -1,10 +1,11 @@
package org.springframework.security.expression.support; package org.springframework.security.expression.web.support;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Arrays; import java.util.Arrays;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.expression.support.SecurityExpressionRoot;
import org.springframework.security.intercept.web.FilterInvocation; import org.springframework.security.intercept.web.FilterInvocation;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;

@ -15,7 +15,7 @@
package org.springframework.security.intercept.web; package org.springframework.security.intercept.web;
import org.springframework.security.util.UrlUtils; import org.springframework.security.web.util.UrlUtils;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
@ -65,7 +65,7 @@ public class FilterInvocation {
* Indicates the URL that the user agent used for this request. * Indicates the URL that the user agent used for this request.
* <p> * <p>
* The returned URL does <b>not</b> reflect the port number determined from a * The returned URL does <b>not</b> reflect the port number determined from a
* {@link org.springframework.security.util.PortResolver}. * {@link org.springframework.security.web.util.PortResolver}.
* *
* @return the full URL of this request * @return the full URL of this request
*/ */

@ -1,9 +1,9 @@
package org.springframework.security.securechannel; package org.springframework.security.securechannel;
import org.springframework.security.util.PortMapper; import org.springframework.security.web.util.PortMapper;
import org.springframework.security.util.PortResolver; import org.springframework.security.web.util.PortMapperImpl;
import org.springframework.security.util.PortMapperImpl; import org.springframework.security.web.util.PortResolver;
import org.springframework.security.util.PortResolverImpl; import org.springframework.security.web.util.PortResolverImpl;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;

@ -12,8 +12,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.springframework.security.Authentication; import org.springframework.security.Authentication;
import org.springframework.security.ui.logout.LogoutHandler; import org.springframework.security.ui.logout.LogoutHandler;
import org.springframework.security.util.RedirectUtils; import org.springframework.security.web.util.RedirectUtils;
import org.springframework.security.util.UrlUtils; import org.springframework.security.web.util.UrlUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;

@ -38,8 +38,8 @@ import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.event.authentication.InteractiveAuthenticationSuccessEvent; import org.springframework.security.event.authentication.InteractiveAuthenticationSuccessEvent;
import org.springframework.security.ui.rememberme.NullRememberMeServices; import org.springframework.security.ui.rememberme.NullRememberMeServices;
import org.springframework.security.ui.rememberme.RememberMeServices; import org.springframework.security.ui.rememberme.RememberMeServices;
import org.springframework.security.util.SessionUtils; import org.springframework.security.web.util.SessionUtils;
import org.springframework.security.util.UrlUtils; import org.springframework.security.web.util.UrlUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**

@ -9,8 +9,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.security.AuthenticationException; import org.springframework.security.AuthenticationException;
import org.springframework.security.util.RedirectUtils; import org.springframework.security.web.util.RedirectUtils;
import org.springframework.security.util.UrlUtils; import org.springframework.security.web.util.UrlUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**

@ -23,10 +23,10 @@ import org.springframework.security.AuthenticationTrustResolverImpl;
import org.springframework.security.InsufficientAuthenticationException; import org.springframework.security.InsufficientAuthenticationException;
import org.springframework.security.context.SecurityContextHolder; import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.ui.savedrequest.SavedRequest; import org.springframework.security.ui.savedrequest.SavedRequest;
import org.springframework.security.util.PortResolver;
import org.springframework.security.util.PortResolverImpl;
import org.springframework.security.util.ThrowableAnalyzer; import org.springframework.security.util.ThrowableAnalyzer;
import org.springframework.security.util.ThrowableCauseExtractor; import org.springframework.security.util.ThrowableCauseExtractor;
import org.springframework.security.web.util.PortResolver;
import org.springframework.security.web.util.PortResolverImpl;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -176,7 +176,7 @@ public class ExceptionTranslationFilter extends SpringSecurityFilter implements
* <code>false</code>. * <code>false</code>.
* <p> * <p>
* Remember to also set * Remember to also set
* {@link org.springframework.security.context.HttpSessionSecurityContextRepository#setAllowSessionCreation(boolean)} * {@link org.springframework.security.context.web.HttpSessionSecurityContextRepository#setAllowSessionCreation(boolean)}
* to <code>false</code> if you set this property to <code>false</code>. * to <code>false</code> if you set this property to <code>false</code>.
* *
* @return <code>true</code> if the <code>HttpSession</code> will be * @return <code>true</code> if the <code>HttpSession</code> will be

Some files were not shown because too many files have changed in this diff Show More