Spring Security LDAP-使用AuthenticationManagerBuilder拒绝上下文

时间:2018-09-25 19:01:30

标签: spring-boot spring-security ldap

我已经成功地使用LDAP从ActiveDirectory检索用户。 但是,为此,我必须像这样手动实例化BaseLdapPathContextSource

Spring Security的有效配置:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldapProperties.getServer());
    contextSource.setUserDn(ldapProperties.getUserDN());
    contextSource.setPassword(ldapProperties.getPassword());
    contextSource.setBase(ldapProperties.getRootDN());
    contextSource.afterPropertiesSet();

    // @formatter:off
    auth.ldapAuthentication()
        .contextSource(contextSource)
        .userDnPatterns(new String[]{ ldapProperties.getUserOU() })
        .userSearchBase("")
        .userSearchFilter("(sAMAccountName={0})")
        .ldapAuthoritiesPopulator((userData, username) -> 
            Collections.singleton(new SimpleGrantedAuthority("CLIENT"))
        );
    // @formatter:on
}

如果我不是使用构建器提供的方法,那么每次登录尝试都会被拒绝。

无法使用Spring Security配置:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
        .contextSource()
                .url(ldapProperties.getServer())
                .managerDn(ldapProperties.getUserDN())
                .managerPassword(ldapProperties.getPassword())
                .root(ldapProperties.getRootDN())
                .and()
        .userDnPatterns(new String[]{ ldapProperties.getUserOU() })
        .userSearchBase("")
        .userSearchFilter("(sAMAccountName={0})")
        .ldapAuthoritiesPopulator((userData, username) -> 
            Collections.singleton(new SimpleGrantedAuthority("CLIENT"))
        );
}

我已经调试了ContextSourceBuilder,并且它也正在构建DefaultSpringSecurityContextSource,与我的操作类似。 手动构建的上下文与构建器提供的上下文之间的唯一区别似乎是,objectPostProcessor被在良性构建之后应用于该上下文。但是,其中大多数只是自动装配bean。

在失败的身份验证(应该已经成功)上提供的日志:

  

2018-09-25 15:45:25.679调试10784 --- [nio-8080-exec-3] o.s.s.authentication.ProviderManager:使用org.springframework.security.ldap.authentication.LdapAuthenticationProvider进行身份验证尝试

     

2018-09-25 15:45:25.680调试10784 --- [nio-8080-exec-3] o.s.s.l.a.LdapAuthenticationProvider:处理用户的认证请求:mcurrao

     

2018-09-25 15:45:25.689调试10784 --- [nio-8080-exec-3] o.s.s.l.a.BindAuthenticator:尝试以ou = factory的方式绑定

     

2018-09-25 15:45:25.689调试10784 --- [nio-8080-exec-3] s.s.l.DefaultSpringSecurityContextSource:删除用户ou = [my_ou]的池标志

     

2018-09-25 15:45:25.694调试10784 --- [nio-8080-exec-3] osslaBindAuthenticator:未能绑定为OU = [my_ou]:org.springframework.ldap.AuthenticationException:[LDAP :错误代码49-80090308:LdapErr:DSID-0C090400,注释:AcceptSecurityContext错误,数据52e,v1db1

注意:[my_ou]实际上已被替换为我自己的ou。但由于我不知道这有多敏感,所以最好不要冒险。

注2:仅通过启用Spring调试日志记录来提供此日志。如果未启用该调试,则不会引发异常,也不会提供有关登录尝试的信息。

此错误代码似乎只是“找不到用户”错误。

TL; DR:如果我使用提供的contextSource()构建器,则LDAP身份验证不起作用,这迫使我实例化上下文源。

0 个答案:

没有答案