|
@@ -1,34 +1,22 @@
|
|
|
package org.springframework.security.config;
|
|
|
|
|
|
import org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator;
|
|
|
-import org.springframework.security.ldap.SpringSecurityContextSource;
|
|
|
import org.springframework.security.providers.ldap.LdapAuthenticationProvider;
|
|
|
import org.springframework.security.providers.ldap.authenticator.BindAuthenticator;
|
|
|
-import org.springframework.security.intercept.method.aopalliance.MethodSecurityInterceptor;
|
|
|
-import org.springframework.security.ui.rememberme.RememberMeServices;
|
|
|
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.config.RuntimeBeanReference;
|
|
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
|
|
-import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
|
|
import org.springframework.beans.factory.xml.BeanDefinitionParser;
|
|
|
import org.springframework.beans.factory.xml.ParserContext;
|
|
|
-import org.springframework.beans.BeansException;
|
|
|
-import org.springframework.core.Ordered;
|
|
|
-import org.springframework.ldap.core.ContextSource;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
import org.apache.commons.logging.Log;
|
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
import org.w3c.dom.Element;
|
|
|
|
|
|
-import java.util.Map;
|
|
|
-
|
|
|
/**
|
|
|
* Experimental "security:ldap" namespace configuration.
|
|
|
*
|
|
|
- *
|
|
|
* @author Luke Taylor
|
|
|
* @version $Id$
|
|
|
* @since 2.0
|
|
@@ -40,7 +28,8 @@ public class LdapProviderBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
private static final String ATT_SERVER = "server-ref";
|
|
|
|
|
|
private static final String OPT_DEFAULT_DN_PATTERN = "uid={0},ou=people";
|
|
|
- private static final String DEFAULT_GROUP_CONTEXT = "ou=groups";
|
|
|
+ private static final String DEF_GROUP_CONTEXT = "ou=groups";
|
|
|
+ private static final String DEF_GROUP_SEARCH_FILTER = "(uniqueMember={0})";
|
|
|
|
|
|
|
|
|
public BeanDefinition parse(Element elt, ParserContext parserContext) {
|
|
@@ -57,47 +46,18 @@ public class LdapProviderBeanDefinitionParser implements BeanDefinitionParser {
|
|
|
bindAuthenticator.getPropertyValues().addPropertyValue("userDnPatterns", new String[] {OPT_DEFAULT_DN_PATTERN});
|
|
|
RootBeanDefinition authoritiesPopulator = new RootBeanDefinition(DefaultLdapAuthoritiesPopulator.class);
|
|
|
authoritiesPopulator.getConstructorArgumentValues().addGenericArgumentValue(contextSource);
|
|
|
- authoritiesPopulator.getConstructorArgumentValues().addGenericArgumentValue(DEFAULT_GROUP_CONTEXT);
|
|
|
+ authoritiesPopulator.getConstructorArgumentValues().addGenericArgumentValue(DEF_GROUP_CONTEXT);
|
|
|
+ // TODO: Change to using uniqueMember as default
|
|
|
+// authoritiesPopulator.getPropertyValues().addPropertyValue("groupSearchFilter", DEF_GROUP_SEARCH_FILTER);
|
|
|
|
|
|
RootBeanDefinition ldapProvider = new RootBeanDefinition(LdapAuthenticationProvider.class);
|
|
|
ldapProvider.getConstructorArgumentValues().addGenericArgumentValue(bindAuthenticator);
|
|
|
ldapProvider.getConstructorArgumentValues().addGenericArgumentValue(authoritiesPopulator);
|
|
|
|
|
|
- registerPostProcessorIfNecessary(parserContext.getRegistry());
|
|
|
+ LdapConfigUtils.registerPostProcessorIfNecessary(parserContext.getRegistry());
|
|
|
|
|
|
ConfigUtils.getRegisteredProviders(parserContext).add(ldapProvider);
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
- // Todo: Move to utility class when we add ldap-user-service, as this check will be needed even if no
|
|
|
- // provider is added.
|
|
|
- private static class ContextSourceSettingPostProcessor implements BeanFactoryPostProcessor, Ordered {
|
|
|
-
|
|
|
- public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) throws BeansException {
|
|
|
- Map beans = bf.getBeansOfType(SpringSecurityContextSource.class);
|
|
|
-
|
|
|
- if (beans.size() == 0) {
|
|
|
- throw new SecurityConfigurationException("No SpringSecurityContextSource instances found. Have you " +
|
|
|
- "added an <" + Elements.LDAP_SERVER + " /> element to your application context?");
|
|
|
- } else if (beans.size() > 1) {
|
|
|
- throw new SecurityConfigurationException("More than one SpringSecurityContextSource instance found. " +
|
|
|
- "Please specify a specific server id when configuring your <" + Elements.LDAP_PROVIDER + ">");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public int getOrder() {
|
|
|
- return LOWEST_PRECEDENCE;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- public void registerPostProcessorIfNecessary(BeanDefinitionRegistry registry) {
|
|
|
- if (registry.containsBeanDefinition(BeanIds.CONTEXT_SOURCE_SETTING_POST_PROCESSOR)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- registry.registerBeanDefinition(BeanIds.CONTEXT_SOURCE_SETTING_POST_PROCESSOR,
|
|
|
- new RootBeanDefinition(LdapProviderBeanDefinitionParser.ContextSourceSettingPostProcessor.class));
|
|
|
- }
|
|
|
}
|