From 2987b62893cb227d09f3828080864c4b4d4488a6 Mon Sep 17 00:00:00 2001 From: Vishal Puri Date: Thu, 14 Jun 2007 04:51:16 +0000 Subject: [PATCH] SEC-271: autoconfig work --- sandbox/spring-security-config/.classpath | 2 +- ...icationRepositoryBeanDefinitionParser.java | 7 -- .../AutoConfigBeanDefinitionParser.java | 51 +++++++++++++ ...ontextIntegrationBeanDefinitionParser.java | 69 ++++++++++-------- .../LogoutFilterBeanDefinitionParser.java | 58 +++++++++++++-- ...incipalRepositoryBeanDefinitionParser.java | 18 +++-- .../RememberMeFilterBeanDefinitionParser.java | 5 -- ...ememberMeServicesBeanDefinitionParser.java | 72 +++++++++++++------ .../SecurityAutoDetectNamepsaceHandler.java | 21 ++++++ .../config/SecurityNamespaceHandler.java | 1 + .../config/spring-security-2.0.xsd | 5 +- .../AutoConfigBeanDefinitionParserTests.java | 35 +++++++++ .../PrincipalRepositoryNamespaceTests.java | 5 +- .../src/test/resources/log4j.properties | 2 +- .../applicationContext-acegi-security.xml | 2 - .../config/authentication-basic-filter.xml | 4 +- .../org/acegisecurity/config/auto-config.xml | 50 +++++++++++++ 17 files changed, 313 insertions(+), 94 deletions(-) create mode 100644 sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AutoConfigBeanDefinitionParser.java create mode 100644 sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityAutoDetectNamepsaceHandler.java create mode 100644 sandbox/spring-security-config/src/test/java/org/acegisecurity/config/AutoConfigBeanDefinitionParserTests.java create mode 100644 sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/auto-config.xml diff --git a/sandbox/spring-security-config/.classpath b/sandbox/spring-security-config/.classpath index db7ac3b23f..19af352e04 100644 --- a/sandbox/spring-security-config/.classpath +++ b/sandbox/spring-security-config/.classpath @@ -32,7 +32,7 @@ - + diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AuthenticationRepositoryBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AuthenticationRepositoryBeanDefinitionParser.java index 4674f1b128..7ea5411b2a 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AuthenticationRepositoryBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AuthenticationRepositoryBeanDefinitionParser.java @@ -70,13 +70,6 @@ public class AuthenticationRepositoryBeanDefinitionParser extends AbstractBeanDe repositoryBeanDef.getPropertyValues().addPropertyValue(USER_DETAILS_SERVICE, new RuntimeBeanReference(userDetailsRef)); } - else { - // autodetect userDetailsService from App Context - RootBeanDefinition depConfigurer = new RootBeanDefinition( - AuthenticationRepositoryDependenciesConfigurer.class); - BeanDefinitionHolder holder = new BeanDefinitionHolder(depConfigurer, parserContext.getReaderContext().generateBeanName(depConfigurer)); - registerBeanDefinition(holder, parserContext.getRegistry()); - } return repositoryBeanDef; } diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AutoConfigBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AutoConfigBeanDefinitionParser.java new file mode 100644 index 0000000000..e85edd2cb5 --- /dev/null +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/AutoConfigBeanDefinitionParser.java @@ -0,0 +1,51 @@ +/** + * + */ +package org.acegisecurity.config; + +import org.acegisecurity.context.HttpSessionContextIntegrationFilter; +import org.acegisecurity.ui.logout.LogoutFilter; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; +import org.springframework.beans.factory.xml.BeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.w3c.dom.Element; + +/** + * Parses 'autoconfig' tag and creates all the required + * BeanDefinitions with their default configurations. It also + * resolves their dependencies and wire them together. + * + * @author Vishal Puri + * + */ +public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser { + + public BeanDefinition parse(Element element, ParserContext parserContext) { + createAndRegisterBeanDefinitionForHttpSessionContextIntegrationFilter(parserContext); + createAndRegisterBeanDefinitionForLogoutFilter(parserContext); + + return null; + } + + private void createAndRegisterBeanDefinitionForLogoutFilter(ParserContext parserContext) { + RootBeanDefinition defintion =LogoutFilterBeanDefinitionParser.doCreateBeanDefinitionWithDefaults(); + registerBeanDefinition(parserContext, defintion); + } + + private void createAndRegisterBeanDefinitionForHttpSessionContextIntegrationFilter(ParserContext parserContext) { + RootBeanDefinition defintion = ContextIntegrationBeanDefinitionParser.doCreateBeanDefinitionWithDefaults(); + registerBeanDefinition(parserContext, defintion); + } + + /** + * @param parserContext + * @param defintion + */ + private void registerBeanDefinition(ParserContext parserContext, RootBeanDefinition defintion) { + parserContext.getRegistry().registerBeanDefinition(parserContext.getReaderContext().generateBeanName(defintion), defintion); + } + +} diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ContextIntegrationBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ContextIntegrationBeanDefinitionParser.java index a58b5b5956..a00a56d17c 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ContextIntegrationBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/ContextIntegrationBeanDefinitionParser.java @@ -4,7 +4,9 @@ package org.acegisecurity.config; import org.acegisecurity.context.HttpSessionContextIntegrationFilter; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.core.Conventions; @@ -20,12 +22,10 @@ import org.w3c.dom.NamedNodeMap; * */ public class ContextIntegrationBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { - + private static final String HTTP_SESSION_CONTEXT_INTEGRATION = "session-context-integration"; - + private static final String SESSION_CREATION = "sessionCreation"; - - private static final String IF_REQUIRED = "ifRequired"; @@ -33,46 +33,55 @@ public class ContextIntegrationBeanDefinitionParser extends AbstractSingleBeanDe private static final String NEVER = "never"; - - + private static final String ALLOW_SESSION_CREATION = "allowSessionCreation"; + + private BeanDefinitionBuilder builder; + protected Class getBeanClass(Element element) { return HttpSessionContextIntegrationFilter.class; } - - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - + NamedNodeMap attributes = element.getAttributes(); - + for (int x = 0; x < attributes.getLength(); x++) { Attr attribute = (Attr) attributes.item(x); String attributeName = attribute.getLocalName(); - if ( !ID_ATTRIBUTE.equals(attributeName)) { + if (!ID_ATTRIBUTE.equals(attributeName)) { if (attributeName.equals(SESSION_CREATION)) { String sessionCreation = element.getAttribute(SESSION_CREATION); - - if(sessionCreation.equals(IF_REQUIRED)) { - builder.addPropertyValue("allowSessionCreation", Boolean.TRUE); - } - - if(sessionCreation.equals(ALWAYS)) { - builder.addPropertyValue("allowSessionCreation", Boolean.TRUE); - } - - if(sessionCreation.equals(NEVER)) { - builder.addPropertyValue("allowSessionCreation", Boolean.FALSE); - } + createBeanDefinition(builder, sessionCreation); } - else{ + else { String propertyName = Conventions.attributeNameToPropertyName(attributeName); - Assert.state(StringUtils.hasText(propertyName), - "Illegal property name returned from 'extractPropertyName(String)': cannot be null or empty."); - builder.addPropertyValue(propertyName, attribute.getValue()); + Assert + .state(StringUtils.hasText(propertyName), + "Illegal property name returned from 'extractPropertyName(String)': cannot be null or empty."); + builder.addPropertyValue(propertyName, attribute.getValue()); } } - } + } + } + + private void createBeanDefinition(BeanDefinitionBuilder builder, String attribute) { + if (attribute.equals(IF_REQUIRED)) { + builder.addPropertyValue(ALLOW_SESSION_CREATION, Boolean.TRUE); + } + else if (attribute.equals(ALWAYS)) { + builder.addPropertyValue(ALLOW_SESSION_CREATION, Boolean.TRUE); + } + else if (attribute.equals(NEVER)) { + builder.addPropertyValue(ALLOW_SESSION_CREATION, Boolean.FALSE); + } + else { + doCreateBeanDefinitionWithDefaults(); + } + } + + protected static RootBeanDefinition doCreateBeanDefinitionWithDefaults() { + RootBeanDefinition definition = new RootBeanDefinition(HttpSessionContextIntegrationFilter.class); + definition.getPropertyValues().addPropertyValue(ALLOW_SESSION_CREATION, Boolean.TRUE); + return definition; } } - - diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/LogoutFilterBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/LogoutFilterBeanDefinitionParser.java index 9c81a1bd82..678eb0786b 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/LogoutFilterBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/LogoutFilterBeanDefinitionParser.java @@ -4,7 +4,11 @@ package org.acegisecurity.config; import org.acegisecurity.ui.logout.LogoutFilter; +import org.acegisecurity.ui.logout.SecurityContextLogoutHandler; +import org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; @@ -23,6 +27,8 @@ public class LogoutFilterBeanDefinitionParser extends AbstractBeanDefinitionPars private static final String LOGOUT_URL = "logoutUrl"; + private static final String REDIRECT_AFTER_LOGOUT_URL_VALUE = "/"; + // ~ Methods // ================================================================================================ @@ -30,27 +36,45 @@ public class LogoutFilterBeanDefinitionParser extends AbstractBeanDefinitionPars // add the properties RootBeanDefinition definition = new RootBeanDefinition(LogoutFilter.class); - setConstructorArgumentIfAvailable(0, element, REDIRECT_AFTER_LOGOUT_URL, "logoutSuccessUrl", definition); - - setPropertyIfAvailable(element, LOGOUT_URL, "filterProcessesUrl", definition); + doCreateBeanDefinition(definition, element, parserContext, false); + return definition; + } + /** + * + * @param definition + * @param element + * @param parserContext + * @param isAutoconfig + * @see {@link AutoConfigBeanDefinitionParser} + */ + private void doCreateBeanDefinition(RootBeanDefinition definition, Element element, ParserContext parserContext, + boolean isAutoconfig) { + + setConstructorArgumentIfAvailable(0, element, REDIRECT_AFTER_LOGOUT_URL, "logoutSuccessUrl", definition); + setPropertyIfAvailable(element, LOGOUT_URL, "filterProcessesUrl", definition); + /* TODO: Move this logic to LogoutFilter itlself */ // register BFPP to check if LogoutFilter does not have setHandlers - // populated, introspect app ctx for LogoutHandlers, using Ordered (if + // populated, introspect app ctx for LogoutHandlers, using Ordered + // (if // present, otherwise assume Integer.MAX_VALUE) RootBeanDefinition bfpp = new RootBeanDefinition(LogoutHandlerOrderResolver.class); parserContext.getReaderContext().registerWithGeneratedName(bfpp); - return definition; } private void setConstructorArgumentIfAvailable(int index, Element element, String attribute, String property, RootBeanDefinition definition) { String propertyValue = element.getAttribute(attribute); if (StringUtils.hasText(propertyValue)) { - definition.getConstructorArgumentValues().addIndexedArgumentValue(index, propertyValue); + addConstructorArgument(index, definition, propertyValue); } } + private void addConstructorArgument(int index, RootBeanDefinition definition, String propertyValue) { + definition.getConstructorArgumentValues().addIndexedArgumentValue(index, propertyValue); + } + private void setPropertyIfAvailable(Element element, String attribute, String property, RootBeanDefinition definition) { String propertyValue = element.getAttribute(attribute); @@ -59,6 +83,26 @@ public class LogoutFilterBeanDefinitionParser extends AbstractBeanDefinitionPars } } - // + /** + * Creates BeanDefintion as required by 'autoconfig' tag + * + * @param definition The BeanDefinition for Logoutfilter + * @param element + * @param parserContext + * @param isAutoconfig + * @return definition + */ + protected static RootBeanDefinition doCreateBeanDefinitionWithDefaults() { + RootBeanDefinition definition = new RootBeanDefinition(LogoutFilter.class); + definition.getConstructorArgumentValues().addIndexedArgumentValue(0, REDIRECT_AFTER_LOGOUT_URL_VALUE); + // create BeanDefinitions for LogoutHandlers + // (TokenBasedRememberMeServices) and (SecuritycontextLogoutHandler) + ManagedList handlers = new ManagedList(); + RootBeanDefinition rememberMeServices = RememberMeServicesBeanDefinitionParser.doCreateBeanDefintionWithDefaults(); + handlers.add(rememberMeServices); + handlers.add(new RootBeanDefinition(SecurityContextLogoutHandler.class)); + definition.getConstructorArgumentValues().addIndexedArgumentValue(1, handlers); + return definition; + } } diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/PrincipalRepositoryBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/PrincipalRepositoryBeanDefinitionParser.java index 581c95f74f..1076a6aa07 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/PrincipalRepositoryBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/PrincipalRepositoryBeanDefinitionParser.java @@ -28,16 +28,17 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; -/** +/** * @author vpuri * */ public class PrincipalRepositoryBeanDefinitionParser extends AbstractBeanDefinitionParser implements BeanDefinitionParser { - - // ~ Static fields/initializers ===================================================================================== - private static final Log logger = LogFactory.getLog(PrincipalRepositoryBeanDefinitionParser.class); + // ~ Static fields/initializers + // ===================================================================================== + + private static final Log logger = LogFactory.getLog(PrincipalRepositoryBeanDefinitionParser.class); // ~ Instance fields // ================================================================================================ @@ -76,15 +77,15 @@ public class PrincipalRepositoryBeanDefinitionParser extends AbstractBeanDefinit private static final String GRANTED_AUTHORITY_REF = "granted-authority-ref"; private static final String AUTHORITY = "authority"; - - private static final String AUTHORITY_BEAN_REF="authorityBeanRef"; + + private static final String AUTHORITY_BEAN_REF = "authorityBeanRef"; // ~ Method // ================================================================================================ /** * */ - + protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { NodeList userDetailsServiceChildren = element.getChildNodes(); RootBeanDefinition userDetailsServiceDefinition = null; @@ -95,7 +96,6 @@ public class PrincipalRepositoryBeanDefinitionParser extends AbstractBeanDefinit Element ele = (Element) userDetailsService; userDetailsServiceDefinition = parseUserDetailsServiceJdbcDefinition(ele); userDetailsServiceDefinition.setSource(parserContext.extractSource(element)); - parserContext.getReaderContext().registerWithGeneratedName(userDetailsServiceDefinition); } if (PROPERTIES.equals(userDetailsService.getLocalName()) && userDetailsService.getNodeType() == Node.ELEMENT_NODE) { @@ -105,7 +105,6 @@ public class PrincipalRepositoryBeanDefinitionParser extends AbstractBeanDefinit userDetailsServiceDefinition.getPropertyValues().addPropertyValue(USER_PROPERTIES, new RuntimeBeanReference(createPropertiesBeanDefinition(ele, parserContext))); userDetailsServiceDefinition.setSource(parserContext.extractSource(element)); - parserContext.getReaderContext().registerWithGeneratedName(userDetailsServiceDefinition); } if (USER_DEFINITION.equals(userDetailsService.getLocalName()) && userDetailsService.getNodeType() == Node.ELEMENT_NODE) { @@ -133,7 +132,6 @@ public class PrincipalRepositoryBeanDefinitionParser extends AbstractBeanDefinit userMap.addUser(user); definition.getPropertyValues().addPropertyValue("userMap", userMap); return definition; - } private String createPropertiesBeanDefinition(Element ele, ParserContext parserContext) { diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeFilterBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeFilterBeanDefinitionParser.java index 0d56d8aa2e..e18753386d 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeFilterBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeFilterBeanDefinitionParser.java @@ -41,9 +41,4 @@ public class RememberMeFilterBeanDefinitionParser extends AbstractBeanDefinition } return rememberMeFilterBeanDef; } - - - - - } diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeServicesBeanDefinitionParser.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeServicesBeanDefinitionParser.java index d49be42067..1bae3af80a 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeServicesBeanDefinitionParser.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/RememberMeServicesBeanDefinitionParser.java @@ -15,41 +15,67 @@ import org.springframework.util.StringUtils; import org.w3c.dom.Element; /** - * Parses + * Parses * @author vpuri - * + * */ public class RememberMeServicesBeanDefinitionParser extends AbstractBeanDefinitionParser implements BeanDefinitionParser { - + private static final String PRINCIPAL_REPOSITORY_BEAN_REF = "principalRepositoryBeanRef"; - + private static final String USER_DETAILS_SERVICE_PROPERTY = "userDetailsService"; - + /* - * key is optional; if unspecified, pick a rnd int and use for all unspecified key properties for acegi beans + * key is optional; if unspecified, pick a rnd int and use for all + * unspecified key properties for acegi beans */ private static final String KEY = "key"; protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { - Assert.notNull(parserContext, "ParserContext must not be null"); - - RootBeanDefinition rememberMeServicesBeanDef = new RootBeanDefinition(TokenBasedRememberMeServices.class); - - String keyValue = element.getAttribute(KEY); - if (StringUtils.hasLength(keyValue)) { - rememberMeServicesBeanDef.getPropertyValues().addPropertyValue(KEY,keyValue); - } else { - // pick a rnd int - } - - // check if rememberMeServicesBeanRef is defined and if it's specified use its referred bean - String rememberMeServicesRef = element.getAttribute(PRINCIPAL_REPOSITORY_BEAN_REF); - if (StringUtils.hasLength(rememberMeServicesRef)) { - rememberMeServicesBeanDef.getPropertyValues().addPropertyValue(USER_DETAILS_SERVICE_PROPERTY, - new RuntimeBeanReference(rememberMeServicesRef)); - } + RootBeanDefinition rememberMeServicesBeanDef = createBeanDefinition(element, parserContext); return rememberMeServicesBeanDef; } + private RootBeanDefinition createBeanDefinition(Element element, ParserContext parserContext) { + Assert.notNull(parserContext, "ParserContext must not be null"); + + RootBeanDefinition rememberMeServicesBeanDef = new RootBeanDefinition(TokenBasedRememberMeServices.class); + + String keyValue = ""; + String rememberMeServicesRef = ""; + + if (element != null) { + keyValue = element.getAttribute(KEY); + + if (StringUtils.hasLength(keyValue)) { + rememberMeServicesBeanDef.getPropertyValues().addPropertyValue(KEY, keyValue); + } + else { + /* + * TODO: pick a rnd int and apply it whenver required in + * applicationcontext + */ + + } + + // check if rememberMeServicesBeanRef is defined and if it's + // specified + // use its referred bean + rememberMeServicesRef = element.getAttribute(PRINCIPAL_REPOSITORY_BEAN_REF); + if (StringUtils.hasLength(rememberMeServicesRef)) { + rememberMeServicesBeanDef.getPropertyValues().addPropertyValue(USER_DETAILS_SERVICE_PROPERTY, + new RuntimeBeanReference(rememberMeServicesRef)); + } + } + + return rememberMeServicesBeanDef; + } + + protected static RootBeanDefinition doCreateBeanDefintionWithDefaults(){ + RootBeanDefinition definition = new RootBeanDefinition(TokenBasedRememberMeServices.class); + definition.getPropertyValues().addPropertyValue(KEY, "key"); + return definition; + } + } diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityAutoDetectNamepsaceHandler.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityAutoDetectNamepsaceHandler.java new file mode 100644 index 0000000000..98d3bf7271 --- /dev/null +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityAutoDetectNamepsaceHandler.java @@ -0,0 +1,21 @@ +/** + * + */ +package org.acegisecurity.config; + +import org.springframework.beans.factory.xml.NamespaceHandlerSupport; + +/** + * @author Vishal Puri + * + */ +public class SecurityAutoDetectNamepsaceHandler extends NamespaceHandlerSupport { + + /* (non-Javadoc) + * @see org.springframework.beans.factory.xml.NamespaceHandler#init() + */ + public void init() { + registerBeanDefinitionParser("autoconfig", new AutoConfigBeanDefinitionParser()); + } + +} diff --git a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityNamespaceHandler.java b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityNamespaceHandler.java index 31113b0a31..b148e6f669 100644 --- a/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityNamespaceHandler.java +++ b/sandbox/spring-security-config/src/main/java/org/acegisecurity/config/SecurityNamespaceHandler.java @@ -28,6 +28,7 @@ public class SecurityNamespaceHandler extends NamespaceHandlerSupport { registerBeanDefinitionParser("logout-support", new LogoutFilterBeanDefinitionParser()); registerBeanDefinitionParser("exception-translation", new ExceptionTranslationFilterBeanDefinitionParser()); registerBeanDefinitionParser("authentication-form", new AuthenticationProcessingFilterBeanDefinitionParser()); + registerBeanDefinitionParser("autoconfig", new AutoConfigBeanDefinitionParser()); } } diff --git a/sandbox/spring-security-config/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd b/sandbox/spring-security-config/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd index 52de26a17c..edf437da20 100644 --- a/sandbox/spring-security-config/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd +++ b/sandbox/spring-security-config/src/main/resources/org/acegisecurity/config/spring-security-2.0.xsd @@ -4,7 +4,10 @@ xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.springframework.org/schema/security" elementFormDefault="qualified" attributeFormDefault="unqualified"> - + + + + diff --git a/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/AutoConfigBeanDefinitionParserTests.java b/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/AutoConfigBeanDefinitionParserTests.java new file mode 100644 index 0000000000..94e2c7fab2 --- /dev/null +++ b/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/AutoConfigBeanDefinitionParserTests.java @@ -0,0 +1,35 @@ +/** + * + */ +package org.acegisecurity.config; + +import javax.servlet.Filter; + +import junit.framework.TestCase; + +import org.acegisecurity.context.HttpSessionContextIntegrationFilter; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @author Vishal Puri + * + */ +public class AutoConfigBeanDefinitionParserTests extends TestCase { + + public void testContextBeanDefinitionCreated() { + ApplicationContext context = new ClassPathXmlApplicationContext("org/acegisecurity/config/auto-config.xml"); + ConfigurableListableBeanFactory bf = (ConfigurableListableBeanFactory) context.getAutowireCapableBeanFactory(); + String[] names = bf.getBeanNamesForType(HttpSessionContextIntegrationFilter.class); + assertEquals(1, names.length); + HttpSessionContextIntegrationFilter filter = (HttpSessionContextIntegrationFilter) bf.getBean(names[0]); + // check properties + //get the bean + assertTrue(filter.isAllowSessionCreation()); + assertFalse(filter.isForceEagerSessionCreation()); + assertFalse(filter.isCloneFromHttpSession()); + } + + +} diff --git a/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/PrincipalRepositoryNamespaceTests.java b/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/PrincipalRepositoryNamespaceTests.java index 3640d936e4..d7b089aa09 100644 --- a/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/PrincipalRepositoryNamespaceTests.java +++ b/sandbox/spring-security-config/src/test/java/org/acegisecurity/config/PrincipalRepositoryNamespaceTests.java @@ -1,7 +1,4 @@ -/** - * - */ -package org.acegisecurity.config; + package org.acegisecurity.config; import junit.framework.TestCase; diff --git a/sandbox/spring-security-config/src/test/resources/log4j.properties b/sandbox/spring-security-config/src/test/resources/log4j.properties index 7cb80c5bd1..682b56dad8 100644 --- a/sandbox/spring-security-config/src/test/resources/log4j.properties +++ b/sandbox/spring-security-config/src/test/resources/log4j.properties @@ -9,4 +9,4 @@ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n log4j.category.org.acegisecurity=DEBUG -log4j.category.org.springframework=DEBUG \ No newline at end of file +log4j.category.org.springframework=INFO \ No newline at end of file diff --git a/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/applicationContext-acegi-security.xml b/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/applicationContext-acegi-security.xml index 1a00e51fc6..a213108c15 100644 --- a/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/applicationContext-acegi-security.xml +++ b/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/applicationContext-acegi-security.xml @@ -3,9 +3,7 @@ diff --git a/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/auto-config.xml b/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/auto-config.xml new file mode 100644 index 0000000000..31bac8103b --- /dev/null +++ b/sandbox/spring-security-config/src/test/resources/org/acegisecurity/config/auto-config.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + +