Spring Security LDAP通过PasswordComparisonAuthenticator进行身份验证

时间:2016-04-27 13:56:33

标签: java spring authentication spring-security spring-ldap

我想通过PasswordComparisonAuthenticator对用户进行身份验证,而不是绑定。我还没有找到任何使用java代码实现此身份验证的示例或文档。 这是我的绑定配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
@PropertySource(value = { "classpath:application.properties" })
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("myAuthPopulator")
    LdapAuthoritiesPopulator myAuthPopulator;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception{
        LdapContextSource contextSource = new LdapContextSource();
        contextSource.setUrl("ldaps://vdap.fg.loal:636/");
        //contextSource.setBase("DC=fg,DC=local");
        contextSource.setReferral("follow"); 
        contextSource.setUserDn("CN=A0XXX32,CN=Administration,CN=fdam,DC=fg,DC=local");
        contextSource.setPassword("password!");
        contextSource.afterPropertiesSet();

        LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth.ldapAuthentication();

        ldapAuthenticationProviderConfigurer
        .contextSource(contextSource)
        .userSearchBase("CN=ProxyUsers,CN=fdam,DC=fg,DC=local")
        .userSearchFilter("CN={0}")
        .ldapAuthoritiesPopulator(myAuthPopulator);     
    }
}

我试图转换为密码比较代码,但我有几个问题:

    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl("ldaps://vdap.fg.loal:636/");
    //contextSource.setBase("DC=fg,DC=local");
    contextSource.setReferral("follow"); 
    contextSource.setUserDn("CN=A0XXX32,CN=Administration,CN=fdam,DC=fg,DC=local");
    contextSource.setPassword("password!");
    contextSource.afterPropertiesSet();

    LdapAuthenticator authenticator = new PasswordComparisonAuthenticator(contextSource);
    ((PasswordComparisonAuthenticator) authenticator).setPasswordAttributeName("userPassword");
    LdapUserSearch userSearch = new FilterBasedLdapUserSearch("CN=ProxyUsers,CN=fdam,DC=fg,DC=local", "(CN={0})", contextSource);
    ((PasswordComparisonAuthenticator) authenticator).setUserSearch(userSearch);

但我需要设置AuthoritiesPopulator,我甚至有一个例外

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodSecurityInterceptor' defined in class path resource [org/springframework/security/config/annotation/method/configuration/GlobalMethodSecurityConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: An AuthenticationManager is required
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
    at org.springframework.security.access.intercept.aopalliance.MethodSecurityMetadataSourceAdvisor.getAdvice(MethodSecurityMetadataSourceAdvisor.java:107)
    at org.springframework.aop.framework.CglibAopProxy$ProxyCallbackFilter.hashCode(CglibAopProxy.java:941)
    at org.springframework.cglib.proxy.Enhancer$EnhancerKey$$KeyFactoryByCGLIB$$4ce19e8f.hashCode(<generated>)
    at java.util.HashMap.hash(HashMap.java:338)
    at java.util.HashMap.get(HashMap.java:556)
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:199)
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
    at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:55)
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:203)
    ... 27 more
Caused by: java.lang.IllegalArgumentException: An AuthenticationManager is required
    at org.springframework.util.Assert.notNull(Assert.java:115)
    at org.springframework.security.access.intercept.AbstractSecurityInterceptor.afterPropertiesSet(AbstractSecurityInterceptor.java:131)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 43 more
你可以帮帮我吗?我的ldap不允许绑定。感谢

0 个答案:

没有答案