|  | @@ -0,0 +1,76 @@
 | 
											
												
													
														|  | 
 |  | +package org.springframework.security.config;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +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.BeanDefinitionParser;
 | 
											
												
													
														|  | 
 |  | +import org.springframework.beans.factory.xml.ParserContext;
 | 
											
												
													
														|  | 
 |  | +import org.springframework.security.providers.dao.DaoAuthenticationProvider;
 | 
											
												
													
														|  | 
 |  | +import org.springframework.security.userdetails.jdbc.JdbcUserDetailsManager;
 | 
											
												
													
														|  | 
 |  | +import org.springframework.util.StringUtils;
 | 
											
												
													
														|  | 
 |  | +import org.springframework.util.xml.DomUtils;
 | 
											
												
													
														|  | 
 |  | +import org.w3c.dom.Element;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +/**
 | 
											
												
													
														|  | 
 |  | + * Processes the top-level "repository" element.
 | 
											
												
													
														|  | 
 |  | + * 
 | 
											
												
													
														|  | 
 |  | + * <p>A "repository" element is used to indicate a UserDetailsService or equivalent.
 | 
											
												
													
														|  | 
 |  | + * 
 | 
											
												
													
														|  | 
 |  | + * @author Ben Alex
 | 
											
												
													
														|  | 
 |  | + * @version $Id$
 | 
											
												
													
														|  | 
 |  | + */
 | 
											
												
													
														|  | 
 |  | +class RepositoryBeanDefinitionParser implements BeanDefinitionParser {
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	private static final String ATT_CREATE_PROVIDER = "createProvider";
 | 
											
												
													
														|  | 
 |  | +	private static final String DEF_CREATE_PROVIDER = "true";
 | 
											
												
													
														|  | 
 |  | +	private static final String ATT_DATA_SOURCE = "dataSource";
 | 
											
												
													
														|  | 
 |  | +	private static final String ATT_ID = "id";
 | 
											
												
													
														|  | 
 |  | +	
 | 
											
												
													
														|  | 
 |  | +    public BeanDefinition parse(Element element, ParserContext parserContext) {
 | 
											
												
													
														|  | 
 |  | +        boolean createProvider = true;
 | 
											
												
													
														|  | 
 |  | +    	String createProviderAtt = element.getAttribute(ATT_CREATE_PROVIDER);
 | 
											
												
													
														|  | 
 |  | +        if (StringUtils.hasText(createProviderAtt) && "false".equals(createProviderAtt)) {
 | 
											
												
													
														|  | 
 |  | +        	createProvider = false;
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        
 | 
											
												
													
														|  | 
 |  | +    	if (createProvider) {
 | 
											
												
													
														|  | 
 |  | +            ConfigUtils.registerProviderManagerIfNecessary(parserContext);
 | 
											
												
													
														|  | 
 |  | +    	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        Element userServiceElt = DomUtils.getChildElementByTagName(element, Elements.ELT_USER_SERVICE);
 | 
											
												
													
														|  | 
 |  | +        Element jdbcUserServiceElt = DomUtils.getChildElementByTagName(element, Elements.ELT_JDBC_USER_SERVICE);
 | 
											
												
													
														|  | 
 |  | +        Element customUserServiceElt = DomUtils.getChildElementByTagName(element, Elements.ELT_CUSTOM_USER_SERVICE);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (userServiceElt != null) {
 | 
											
												
													
														|  | 
 |  | +            BeanDefinition userDetailsService = new UserServiceBeanDefinitionParser().parse(userServiceElt, parserContext);
 | 
											
												
													
														|  | 
 |  | +            createDaoAuthenticationProviderIfRequired(createProvider, userDetailsService, parserContext);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        
 | 
											
												
													
														|  | 
 |  | +        if (jdbcUserServiceElt != null) {
 | 
											
												
													
														|  | 
 |  | +        	// TODO: Set authenticationManager property
 | 
											
												
													
														|  | 
 |  | +        	// TODO: Have some sensible fallback if dataSource not specified, eg autowire
 | 
											
												
													
														|  | 
 |  | +            BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(JdbcUserDetailsManager.class);
 | 
											
												
													
														|  | 
 |  | +            String dataSource = jdbcUserServiceElt.getAttribute(ATT_DATA_SOURCE);
 | 
											
												
													
														|  | 
 |  | +        	// An explicit dataSource was specified, so use it
 | 
											
												
													
														|  | 
 |  | +            builder.addPropertyReference("dataSource", dataSource);
 | 
											
												
													
														|  | 
 |  | +            parserContext.getRegistry().registerBeanDefinition(BeanIds.JDBC_USER_DETAILS_MANAGER, builder.getBeanDefinition());
 | 
											
												
													
														|  | 
 |  | +            createDaoAuthenticationProviderIfRequired(createProvider, builder.getBeanDefinition(), parserContext);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        
 | 
											
												
													
														|  | 
 |  | +        if (customUserServiceElt != null) {
 | 
											
												
													
														|  | 
 |  | +            String id = customUserServiceElt.getAttribute(ATT_ID);
 | 
											
												
													
														|  | 
 |  | +            BeanDefinition userDetailsService = parserContext.getRegistry().getBeanDefinition(id);
 | 
											
												
													
														|  | 
 |  | +            createDaoAuthenticationProviderIfRequired(createProvider, userDetailsService, parserContext);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        
 | 
											
												
													
														|  | 
 |  | +        return null;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    
 | 
											
												
													
														|  | 
 |  | +    private void createDaoAuthenticationProviderIfRequired(boolean createProvider, BeanDefinition userDetailsService, ParserContext parserContext) {
 | 
											
												
													
														|  | 
 |  | +        if (createProvider) {
 | 
											
												
													
														|  | 
 |  | +            RootBeanDefinition authProvider = new RootBeanDefinition(DaoAuthenticationProvider.class);
 | 
											
												
													
														|  | 
 |  | +            authProvider.getPropertyValues().addPropertyValue("userDetailsService", userDetailsService);
 | 
											
												
													
														|  | 
 |  | +            ConfigUtils.getRegisteredProviders(parserContext).add(authProvider);
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +}
 |