From 0f4cdf345d9bd22b25d222947ed3dbd45ab4fb48 Mon Sep 17 00:00:00 2001 From: Luke Taylor Date: Sat, 13 Oct 2007 16:26:08 +0000 Subject: [PATCH] Intermediate checkin of experimental namespace config work (additional parser files). --- ...nticationProviderBeanDefinitionParser.java | 47 ++++++++++++++ .../AutoConfigBeanDefinitionParser.java | 65 +++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java create mode 100644 core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java diff --git a/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java b/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java new file mode 100644 index 0000000000..3311ab7a34 --- /dev/null +++ b/core/src/main/java/org/springframework/security/config/AuthenticationProviderBeanDefinitionParser.java @@ -0,0 +1,47 @@ +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.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 + * @version $Id$ + */ +public class AuthenticationProviderBeanDefinitionParser extends AbstractBeanDefinitionParser { + private static final String DEFAULT_PROVIDER_BEAN_ID = "_authenticationProvider"; + + protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { + RootBeanDefinition authProvider = new RootBeanDefinition(DaoAuthenticationProvider.class); + + // 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; + } + + // TODO: Check for duplicate using default id here. + + return DEFAULT_PROVIDER_BEAN_ID; + } + +} diff --git a/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java b/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java new file mode 100644 index 0000000000..7796d5974a --- /dev/null +++ b/core/src/main/java/org/springframework/security/config/AutoConfigBeanDefinitionParser.java @@ -0,0 +1,65 @@ +package org.springframework.security.config; + +import org.springframework.beans.factory.xml.BeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.BeansException; +import org.springframework.security.providers.ProviderManager; +import org.springframework.security.providers.AuthenticationProvider; +import org.springframework.security.vote.AffirmativeBased; +import org.springframework.security.vote.RoleVoter; +import org.springframework.security.vote.AuthenticatedVoter; +import org.springframework.core.Ordered; +import org.w3c.dom.Element; + +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * @author luke + * @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); + + accessManager.getPropertyValues().addPropertyValue("decisionVoters", + Arrays.asList(new Object[] {new RoleVoter(), new AuthenticatedVoter()})); + + 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; + } + } +}