|
@@ -2,8 +2,6 @@ package org.springframework.security.config;
|
|
|
|
|
|
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.BeansException;
|
|
|
import org.springframework.beans.PropertyValue;
|
|
@@ -21,91 +19,91 @@ import org.springframework.security.userdetails.UserDetailsService;
|
|
|
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
|
|
|
* @since 2.0.2
|
|
|
*/
|
|
|
public class UserDetailsServiceInjectionBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {
|
|
|
- private final Log logger = LogFactory.getLog(getClass());
|
|
|
- private ConfigurableListableBeanFactory beanFactory;
|
|
|
-
|
|
|
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
|
|
|
- if (BeanIds.X509_AUTH_PROVIDER.equals(beanName)) {
|
|
|
- injectUserDetailsServiceIntoX509Provider((PreAuthenticatedAuthenticationProvider) bean);
|
|
|
- } else if (BeanIds.REMEMBER_ME_SERVICES.equals(beanName)) {
|
|
|
- injectUserDetailsServiceIntoRememberMeServices((AbstractRememberMeServices)bean);
|
|
|
- } else if (BeanIds.OPEN_ID_PROVIDER.equals(beanName)) {
|
|
|
- injectUserDetailsServiceIntoOpenIDProvider(bean);
|
|
|
- }
|
|
|
-
|
|
|
- return bean;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
|
|
- return bean;
|
|
|
- }
|
|
|
-
|
|
|
+ private ConfigurableListableBeanFactory beanFactory;
|
|
|
+
|
|
|
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
|
|
|
+ if (BeanIds.X509_AUTH_PROVIDER.equals(beanName)) {
|
|
|
+ injectUserDetailsServiceIntoX509Provider((PreAuthenticatedAuthenticationProvider) bean);
|
|
|
+ } else if (BeanIds.REMEMBER_ME_SERVICES.equals(beanName)) {
|
|
|
+ injectUserDetailsServiceIntoRememberMeServices((AbstractRememberMeServices)bean);
|
|
|
+ } else if (BeanIds.OPEN_ID_PROVIDER.equals(beanName)) {
|
|
|
+ injectUserDetailsServiceIntoOpenIDProvider(bean);
|
|
|
+ }
|
|
|
+
|
|
|
+ return bean;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
|
|
+ return bean;
|
|
|
+ }
|
|
|
+
|
|
|
private void injectUserDetailsServiceIntoRememberMeServices(AbstractRememberMeServices services) {
|
|
|
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.REMEMBER_ME_SERVICES);
|
|
|
PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("userDetailsService");
|
|
|
|
|
|
if (pv == null) {
|
|
|
- services.setUserDetailsService(getUserDetailsService());
|
|
|
+ services.setUserDetailsService(getUserDetailsService());
|
|
|
} else {
|
|
|
- UserDetailsService cachingUserService = getCachingUserService(pv.getValue());
|
|
|
-
|
|
|
- if (cachingUserService != null) {
|
|
|
- services.setUserDetailsService(cachingUserService);
|
|
|
- }
|
|
|
+ UserDetailsService cachingUserService = getCachingUserService(pv.getValue());
|
|
|
+
|
|
|
+ if (cachingUserService != null) {
|
|
|
+ services.setUserDetailsService(cachingUserService);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void injectUserDetailsServiceIntoX509Provider(PreAuthenticatedAuthenticationProvider provider) {
|
|
|
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.X509_AUTH_PROVIDER);
|
|
|
PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("preAuthenticatedUserDetailsService");
|
|
|
UserDetailsByNameServiceWrapper wrapper = new UserDetailsByNameServiceWrapper();
|
|
|
-
|
|
|
+
|
|
|
if (pv == null) {
|
|
|
- wrapper.setUserDetailsService(getUserDetailsService());
|
|
|
- provider.setPreAuthenticatedUserDetailsService(wrapper);
|
|
|
+ wrapper.setUserDetailsService(getUserDetailsService());
|
|
|
+ provider.setPreAuthenticatedUserDetailsService(wrapper);
|
|
|
} else {
|
|
|
- RootBeanDefinition preAuthUserService = (RootBeanDefinition) pv.getValue();
|
|
|
- Object userService =
|
|
|
- preAuthUserService.getPropertyValues().getPropertyValue("userDetailsService").getValue();
|
|
|
-
|
|
|
- UserDetailsService cachingUserService = getCachingUserService(userService);
|
|
|
-
|
|
|
- if (cachingUserService != null) {
|
|
|
- wrapper.setUserDetailsService(cachingUserService);
|
|
|
- provider.setPreAuthenticatedUserDetailsService(wrapper);
|
|
|
- }
|
|
|
+ RootBeanDefinition preAuthUserService = (RootBeanDefinition) pv.getValue();
|
|
|
+ Object userService =
|
|
|
+ preAuthUserService.getPropertyValues().getPropertyValue("userDetailsService").getValue();
|
|
|
+
|
|
|
+ UserDetailsService cachingUserService = getCachingUserService(userService);
|
|
|
+
|
|
|
+ if (cachingUserService != null) {
|
|
|
+ wrapper.setUserDetailsService(cachingUserService);
|
|
|
+ provider.setPreAuthenticatedUserDetailsService(wrapper);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void injectUserDetailsServiceIntoOpenIDProvider(Object bean) {
|
|
|
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(BeanIds.OPEN_ID_PROVIDER);
|
|
|
PropertyValue pv = beanDefinition.getPropertyValues().getPropertyValue("userDetailsService");
|
|
|
|
|
|
if (pv == null) {
|
|
|
- BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean);
|
|
|
+ BeanWrapperImpl beanWrapper = new BeanWrapperImpl(bean);
|
|
|
beanWrapper.setPropertyValue("userDetailsService", getUserDetailsService());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 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() {
|
|
|
- Map beans = beanFactory.getBeansOfType(CachingUserDetailsService.class);
|
|
|
-
|
|
|
- if (beans.size() == 0) {
|
|
|
- beans = beanFactory.getBeansOfType(UserDetailsService.class);
|
|
|
- }
|
|
|
-
|
|
|
+ Map beans = beanFactory.getBeansOfType(CachingUserDetailsService.class);
|
|
|
+
|
|
|
+ if (beans.size() == 0) {
|
|
|
+ beans = beanFactory.getBeansOfType(UserDetailsService.class);
|
|
|
+ }
|
|
|
+
|
|
|
if (beans.size() == 0) {
|
|
|
throw new SecurityConfigurationException("No UserDetailsService registered.");
|
|
|
|
|
@@ -116,24 +114,24 @@ public class UserDetailsServiceInjectionBeanPostProcessor implements BeanPostPro
|
|
|
|
|
|
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;
|
|
|
+ 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;
|
|
|
- }
|
|
|
+
|
|
|
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
|
|
|
+ this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
|
|
|
+ }
|
|
|
}
|