如何正确使用configurer类实现Spring Security Ldap身份验证?

时间:2015-05-29 14:31:03

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

您好我正在尝试使用WebSecurityConfigurerAdapter类实现spring的ldap身份验证。

到目前为止,我可以通过内存方法甚至我公司的ldap服务器进行身份验证,但是后一种方法我只能在创建新上下文时传递硬编码的用户名和密码进行身份验证,如果我不知道的话创建一个新的上下文或者我没有把userDN和密码,jvm抛出我:

Caused by: javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906E8, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db1\u0000]; Remaining name: '/'

我的问题是,如何从登录表单中获取用户密码和userDN,以便将其置于上下文中?如果不可能,我怎样才能获得密码和userDn的上下文?

这是我的代码:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

        auth.ldapAuthentication().userSearchFilter("(&(objectClass=user)(sAMAccountName={0}))")
          .groupSearchFilter("(&(memberOf:1.2.840.113556.1.4.1941:=CN=DL - DC859 - MIDDLEWARE,OU=Dyn,OU=Dist,OU=Security Groups,OU=POP,DC=pop,DC=corp,DC=local))")
          .contextSource(getLdapContextSource());
    }

    private LdapContextSource getLdapContextSource() throws Exception {
        LdapContextSource cs = new LdapContextSource();
        cs.setUrl("ldap://tcp-prd.pop.corp.local:389");
        cs.setBase("DC=pop,DC=corp,DC=local");
        cs.setUserDn("t8951435@pop.corp.local");
        cs.setPassword("mypassword");
        cs.afterPropertiesSet();
        return cs;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll();     
    }

}

谢谢。

1 个答案:

答案 0 :(得分:2)

我终于从this帖子中找到了它。我仍然不知道如何设置组过滤器,但至少现在我可以绑定到服务器。

-u

编辑:我终于找到了如何按群组过滤。事实证明,他们在ActiveDirectoryLdapAuthenticationProvider类v3.2.6中添加了一个setSearchFilter()方法。因为我使用的是旧版本,所以我从来不知道这一点。所以我用该方法创建了一个类的副本,并创建了一个buildFilter方法来创建传递给setSearchFilter的过滤器字符串。