From 03e285c31d6cbfd6c1691418792b0fb050244849 Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Thu, 25 Oct 2007 14:21:45 +0000 Subject: [PATCH] Moved responsability for creating AuthenticationManager into AuthenticationProviderBeanDefinitionParser. Tidied up SecrityNamespaceHandler. --- ...nticationProviderBeanDefinitionParser.java | 67 +++++++++++-------- .../AutoConfigBeanDefinitionParser.java | 25 +------ .../config/SecurityNamespaceHandler.java | 28 +------- .../webapp/WEB-INF/classes/log4j.properties | 2 + 4 files changed, 44 insertions(+), 78 deletions(-) diff --git a/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java b/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java index 3311ab7a34..4940f933d1 100644 --- a/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java +++ b/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java @@ -1,47 +1,58 @@ package org.springframework.security.config; -import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; -import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.beans.factory.support.AbstractBeanDefinition; -import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.xml.BeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.security.providers.ProviderManager; import org.springframework.security.providers.dao.DaoAuthenticationProvider; -import org.springframework.security.ui.logout.LogoutFilter; import org.springframework.util.xml.DomUtils; -import org.springframework.util.StringUtils; import org.w3c.dom.Element; /** - * @author luke + * @author Luke Taylor * @version $Id$ */ -public class AuthenticationProviderBeanDefinitionParser extends AbstractBeanDefinitionParser { - private static final String DEFAULT_PROVIDER_BEAN_ID = "_authenticationProvider"; +class AuthenticationProviderBeanDefinitionParser implements BeanDefinitionParser { + public static final String DEFAULT_AUTH_MANAGER_ID = "_authenticationManager"; - protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { - RootBeanDefinition authProvider = new RootBeanDefinition(DaoAuthenticationProvider.class); + private BeanDefinition registerProviderManagerIfNecessary(ParserContext parserContext) { + + if(parserContext.getRegistry().containsBeanDefinition(DEFAULT_AUTH_MANAGER_ID)) { + return parserContext.getRegistry().getBeanDefinition(DEFAULT_AUTH_MANAGER_ID); + } + + BeanDefinition authManager = new RootBeanDefinition(ProviderManager.class); + authManager.getPropertyValues().addPropertyValue("providers", new ManagedList()); + parserContext.getRegistry().registerBeanDefinition(DEFAULT_AUTH_MANAGER_ID, authManager); + + return authManager; + } + + private ManagedList getRegisteredProviders(ParserContext parserContext) { + BeanDefinition authManager = registerProviderManagerIfNecessary(parserContext); + return (ManagedList) authManager.getPropertyValues().getPropertyValue("providers").getValue(); + } + + public BeanDefinition parse(Element element, ParserContext parserContext) { + registerProviderManagerIfNecessary(parserContext); + + RootBeanDefinition authProvider; // TODO: Proper implementation Element userServiceElt = DomUtils.getChildElementByTagName(element, "user-service"); - BeanDefinition userDetailsService = new UserServiceBeanDefinitionParser().parse(userServiceElt, parserContext); - authProvider.getPropertyValues().addPropertyValue("userDetailsService", userDetailsService); - - return authProvider; - } - - protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext) throws BeanDefinitionStoreException { - String id = super.resolveId(element, definition, parserContext); - - if (StringUtils.hasText(id)) { - return id; + if (userServiceElt != null) { + authProvider = new RootBeanDefinition(DaoAuthenticationProvider.class); + BeanDefinition userDetailsService = new UserServiceBeanDefinitionParser().parse(userServiceElt, parserContext); + authProvider.getPropertyValues().addPropertyValue("userDetailsService", userDetailsService); + } else { + throw new IllegalArgumentException("Only support user-service provider at the moment."); } - // TODO: Check for duplicate using default id here. - - return DEFAULT_PROVIDER_BEAN_ID; - } + getRegisteredProviders(parserContext).add(authProvider); + return null; + } } diff --git a/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java b/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java index 7796d5974a..6dfd06e781 100644 --- a/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java +++ b/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java @@ -22,19 +22,14 @@ import java.util.ArrayList; import java.util.Arrays; /** - * @author luke + * @author Luke Taylor * @version $Id$ */ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser { - public static final String AUTH_MANAGER_ID = "_authenticationManager"; public static final String DEFAULT_ACCESS_MANAGER_ID = "_accessManager"; public BeanDefinition parse(Element element, ParserContext parserContext) { - RootBeanDefinition authenticationManager = new RootBeanDefinition(ProviderManager.class); BeanDefinitionRegistry registry = parserContext.getRegistry(); - - registry.registerBeanDefinition(AUTH_MANAGER_ID, authenticationManager); - registry.registerBeanDefinition("_autoconfigPP", new RootBeanDefinition(AutoConfigPostProcessor.class)); RootBeanDefinition accessManager = new RootBeanDefinition(AffirmativeBased.class); @@ -44,22 +39,4 @@ public class AutoConfigBeanDefinitionParser implements BeanDefinitionParser { registry.registerBeanDefinition(DEFAULT_ACCESS_MANAGER_ID, accessManager); return null; } - - static class AutoConfigPostProcessor implements BeanFactoryPostProcessor, Ordered { - - public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - BeanDefinition authManager = beanFactory.getBeanDefinition(AUTH_MANAGER_ID); - - Map providerMap = beanFactory.getBeansOfType(AuthenticationProvider.class); - List providers = new ArrayList(providerMap.values()); - - // TODO: Sort providers according to defined ordering - - authManager.getPropertyValues().addPropertyValue("providers", providers); - } - - public int getOrder() { - return HIGHEST_PRECEDENCE; - } - } } diff --git a/core/src/main/java/org/springframework/security/config/SecurityNamespaceHandler.java b/core/src/main/java/org/springframework/security/config/SecurityNamespaceHandler.java index 3cd6ded317..c1f13bee21 100644 --- a/core/src/main/java/org/springframework/security/config/SecurityNamespaceHandler.java +++ b/core/src/main/java/org/springframework/security/config/SecurityNamespaceHandler.java @@ -1,15 +1,6 @@ package org.springframework.security.config; -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.BeanDefinitionHolder; -import org.springframework.beans.factory.support.RootBeanDefinition; -import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.NamespaceHandlerSupport; -import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.security.util.FilterChainProxy; -import org.springframework.util.xml.DomUtils; -import org.w3c.dom.Element; - /** * Registers the bean definition parsers for the "security" namespace (http://www.springframework.org/schema/security). @@ -17,30 +8,15 @@ import org.w3c.dom.Element; * @author Luke Taylor * @version $Id$ */ -public class SecurityNamespaceHandler extends NamespaceHandlerSupport { - public static final String DEFAULT_FILTER_CHAIN_PROXY_ID = "_filterChainProxy"; +public class SecurityNamespaceHandler extends NamespaceHandlerSupport { public void init() { registerBeanDefinitionParser("ldap", new LdapBeanDefinitionParser()); registerBeanDefinitionParser("http", new HttpSecurityBeanDefinitionParser()); + registerBeanDefinitionParser("user-service", new UserServiceBeanDefinitionParser()); registerBeanDefinitionParser("authentication-provider", new AuthenticationProviderBeanDefinitionParser()); registerBeanDefinitionParser("autoconfig", new AutoConfigBeanDefinitionParser()); registerBeanDefinitionDecorator("intercept-methods", new InterceptMethodsBeanDefinitionDecorator()); registerBeanDefinitionDecorator("filter-chain-map", new FilterChainMapBeanDefinitionDecorator()); } - -// private class HttpSecurityBeanDefinitionParser implements BeanDefinitionParser { -// -// public BeanDefinition parse(Element element, ParserContext parserContext) { -// RootBeanDefinition filterChainProxy = new RootBeanDefinition(FilterChainProxy.class); -// -// Element formLoginElt = DomUtils.getChildElementByTagName(element, "form-login"); -// -// if (formLoginElt != null) { -// parse(formLoginElt, parserContext); -// } -// -// return filterChainProxy; -// } -// } } diff --git a/samples/contacts/src/main/webapp/WEB-INF/classes/log4j.properties b/samples/contacts/src/main/webapp/WEB-INF/classes/log4j.properties index b2a41fbef5..d4f6cf26a3 100644 --- a/samples/contacts/src/main/webapp/WEB-INF/classes/log4j.properties +++ b/samples/contacts/src/main/webapp/WEB-INF/classes/log4j.properties @@ -22,6 +22,8 @@ log4j.rootLogger=WARN, stdout, fileout #log4j.logger.org.springframework.security.providers.dao=DEBUG, stdout, fileout log4j.logger.sample.contact=DEBUG, stdout, fileout +log4j.logger.org.springframework.security=DEBUG, stdout, fileout + # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout