Improved javadoc. Some tidying up.

This commit is contained in:
Luke Taylor 2008-08-06 15:28:04 +00:00
parent 7258d30e13
commit e951c42c2b

View File

@ -2,8 +2,6 @@ package org.springframework.security.config;
import java.util.Map; import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeanWrapperImpl;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValue; import org.springframework.beans.PropertyValue;
@ -21,91 +19,91 @@ import org.springframework.security.userdetails.UserDetailsService;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* * Registered by {@link HttpSecurityBeanDefinitionParser} to inject a UserDetailsService into
* the X509Provider, RememberMeServices and OpenIDAuthenticationProvider instances created by
* the namespace.
*
* @author Luke Taylor * @author Luke Taylor
* @since 2.0.2 * @since 2.0.2
*/ */
public class UserDetailsServiceInjectionBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware { public class UserDetailsServiceInjectionBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {
private final Log logger = LogFactory.getLog(getClass()); private ConfigurableListableBeanFactory beanFactory;
private ConfigurableListableBeanFactory beanFactory;
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (BeanIds.X509_AUTH_PROVIDER.equals(beanName)) {
if (BeanIds.X509_AUTH_PROVIDER.equals(beanName)) { injectUserDetailsServiceIntoX509Provider((PreAuthenticatedAuthenticationProvider) bean);
injectUserDetailsServiceIntoX509Provider((PreAuthenticatedAuthenticationProvider) bean); } else if (BeanIds.REMEMBER_ME_SERVICES.equals(beanName)) {
} else if (BeanIds.REMEMBER_ME_SERVICES.equals(beanName)) { injectUserDetailsServiceIntoRememberMeServices((AbstractRememberMeServices)bean);
injectUserDetailsServiceIntoRememberMeServices((AbstractRememberMeServices)bean); } else if (BeanIds.OPEN_ID_PROVIDER.equals(beanName)) {
} else if (BeanIds.OPEN_ID_PROVIDER.equals(beanName)) { injectUserDetailsServiceIntoOpenIDProvider(bean);
injectUserDetailsServiceIntoOpenIDProvider(bean); }
}
return bean;
return bean; }
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
private void injectUserDetailsServiceIntoRememberMeServices(AbstractRememberMeServices services) { private void injectUserDetailsServiceIntoRememberMeServices(AbstractRememberMeServices services) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.REMEMBER_ME_SERVICES); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.REMEMBER_ME_SERVICES);
PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("userDetailsService"); PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("userDetailsService");
if (pv == null) { if (pv == null) {
services.setUserDetailsService(getUserDetailsService()); services.setUserDetailsService(getUserDetailsService());
} else { } else {
UserDetailsService cachingUserService = getCachingUserService(pv.getValue()); UserDetailsService cachingUserService = getCachingUserService(pv.getValue());
if (cachingUserService != null) { if (cachingUserService != null) {
services.setUserDetailsService(cachingUserService); services.setUserDetailsService(cachingUserService);
} }
} }
} }
private void injectUserDetailsServiceIntoX509Provider(PreAuthenticatedAuthenticationProvider provider) { private void injectUserDetailsServiceIntoX509Provider(PreAuthenticatedAuthenticationProvider provider) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.X509_AUTH_PROVIDER); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.X509_AUTH_PROVIDER);
PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("preAuthenticatedUserDetailsService"); PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("preAuthenticatedUserDetailsService");
UserDetailsByNameServiceWrapper wrapper = new UserDetailsByNameServiceWrapper(); UserDetailsByNameServiceWrapper wrapper = new UserDetailsByNameServiceWrapper();
if (pv == null) { if (pv == null) {
wrapper.setUserDetailsService(getUserDetailsService()); wrapper.setUserDetailsService(getUserDetailsService());
provider.setPreAuthenticatedUserDetailsService(wrapper); provider.setPreAuthenticatedUserDetailsService(wrapper);
} else { } else {
RootBeanDefinition preAuthUserService = (RootBeanDefinition) pv.getValue(); RootBeanDefinition preAuthUserService = (RootBeanDefinition) pv.getValue();
Object userService = Object userService =
preAuthUserService.getPropertyValues().getPropertyValue("userDetailsService").getValue(); preAuthUserService.getPropertyValues().getPropertyValue("userDetailsService").getValue();
UserDetailsService cachingUserService = getCachingUserService(userService); UserDetailsService cachingUserService = getCachingUserService(userService);
if (cachingUserService != null) { if (cachingUserService != null) {
wrapper.setUserDetailsService(cachingUserService); wrapper.setUserDetailsService(cachingUserService);
provider.setPreAuthenticatedUserDetailsService(wrapper); provider.setPreAuthenticatedUserDetailsService(wrapper);
} }
} }
} }
private void injectUserDetailsServiceIntoOpenIDProvider(Object bean) { private void injectUserDetailsServiceIntoOpenIDProvider(Object bean) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.OPEN_ID_PROVIDER); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.OPEN_ID_PROVIDER);
PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("userDetailsService"); PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("userDetailsService");
if (pv == null) { if (pv == null) {
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean); BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean);
beanWrapper.setPropertyValue("userDetailsService", getUserDetailsService()); beanWrapper.setPropertyValue("userDetailsService", getUserDetailsService());
} }
} }
/** /**
* Obtains a user details service for use in RememberMeServices etc. Will return a caching version * Obtains a user details service for use in RememberMeServices etc. Will return a caching version
* if available so should not be used for beans which need to separate the two. * if available so should not be used for beans which need to separate the two.
*/ */
UserDetailsService getUserDetailsService() { UserDetailsService getUserDetailsService() {
Map beans = beanFactory.getBeansOfType(CachingUserDetailsService.class); Map beans = beanFactory.getBeansOfType(CachingUserDetailsService.class);
if (beans.size() == 0) { if (beans.size() == 0) {
beans = beanFactory.getBeansOfType(UserDetailsService.class); beans = beanFactory.getBeansOfType(UserDetailsService.class);
} }
if (beans.size() == 0) { if (beans.size() == 0) {
throw new SecurityConfigurationException("No UserDetailsService registered."); throw new SecurityConfigurationException("No UserDetailsService registered.");
@ -116,24 +114,24 @@ public class UserDetailsServiceInjectionBeanPostProcessor implements BeanPostPro
return (UserDetailsService) beans.values().toArray()[0]; return (UserDetailsService) beans.values().toArray()[0];
} }
private UserDetailsService getCachingUserService(Object userServiceRef) {
Assert.isInstanceOf(RuntimeBeanReference.class, userServiceRef,
"userDetailsService property value must be a RuntimeBeanReference");
String id = ((RuntimeBeanReference)userServiceRef).getBeanName();
// Overwrite with the caching version if available
String cachingId = id + AbstractUserDetailsServiceBeanDefinitionParser.CACHING_SUFFIX;
if (beanFactory.containsBeanDefinition(cachingId)) {
return (UserDetailsService) beanFactory.getBean(cachingId);
}
return null;
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException { private UserDetailsService getCachingUserService(Object userServiceRef) {
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory; Assert.isInstanceOf(RuntimeBeanReference.class, userServiceRef,
} "userDetailsService property value must be a RuntimeBeanReference");
String id = ((RuntimeBeanReference)userServiceRef).getBeanName();
// Overwrite with the caching version if available
String cachingId = id + AbstractUserDetailsServiceBeanDefinitionParser.CACHING_SUFFIX;
if (beanFactory.containsBeanDefinition(cachingId)) {
return (UserDetailsService) beanFactory.getBean(cachingId);
}
return null;
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
} }