我已经成功地使用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身份验证不起作用,这迫使我实例化上下文源。