繁体   English   中英

通过 Active Directory LDAP 使用 Spring-Security 进行身份验证

[英]Authentication with Spring-Security via Active Directory LDAP

我无法使用真正的活动目录进行身份验证,让我更好地解释一下,我尝试使用 spring.io 提出的示例进行身份验证,其中内部服务启动时没有任何问题。 参考https://spring.io/guides/gs/authenticating-ldap/

我试图通过插入我的活动目录的配置来修改下面的代码,但没有成功。 您能否指导我或向我展示一个真实的案例,即在不使用示例中的内部服务的情况下建立真正的连接? 我在网上看了看,发现都和官方的例子差不多,没有任何真实案例

@Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .ldapAuthentication()
                .userDnPatterns("uid={0},ou=people")
                .groupSearchBase("ou=groups")
                .contextSource()
                    .url("ldap://localhost:8389/dc=springframework,dc=org")
                    .and()
                .passwordCompare()
                    .passwordEncoder(new LdapShaPasswordEncoder())
                    .passwordAttribute("userPassword");
    }

错误显示:LDAP处理过程中出现未分类异常; 嵌套异常是 javax.naming.NamingException:[LDAP:错误代码 1 - 000004DC:LdapErr:DSID-0C0907C2,注释:为了执行此操作,必须在连接上完成成功绑定。,数据 0,v2580

是的,通过 LDAP 进行身份验证太痛苦了。 为了能够对 AD 执行身份验证,您需要使用ActiveDirectoryLdapAuthenticationProvider 这是工作示例:

@Override
protected void configure(AuthenticationManagerBuilder auth) {
    ActiveDirectoryLdapAuthenticationProvider adProvider =
            new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://localhost:8389");
    adProvider.setConvertSubErrorCodesToExceptions(true);
    adProvider.setUseAuthenticationRequestCredentials(true);
    auth.authenticationProvider(adProvider);
}

为了节省您的时间,请阅读以下内容,这非常重要: AD authentication doc

我在这里找到了一个示例,这很有用:

https://github.com/sachin-awati/Mojito/tree/master/webapp/src/main/java/com/box/l10n/mojito/security

如果在 Active Directory 查找 - loadUserByUsername期间未找到用户,您可以选择实现覆盖mapUserFromContextUserDetailsContextMapperImpl以创建UserDetails object。

@Component
public class UserDetailsContextMapperImpl implements UserDetailsContextMapper {

    @Override
    public UserDetails mapUserFromContext(DirContextOperations dirContextOperations, String username, Collection<? extends GrantedAuthority> authorities) {

        UserDetails userDetails = null;

        try {
            userDetails = userDetailsServiceImpl.loadUserByUsername(username);

        } catch (UsernameNotFoundException e) {
            String givenName = dirContextOperations.getStringAttribute("givenname");
            String surname = dirContextOperations.getStringAttribute("sn");
            String commonName = dirContextOperations.getStringAttribute("cn");

            userDetails = userDetailsServiceImpl.createBasicUser(username, givenName, surname, commonName);
        }

        return userDetails;
    }

确保您使用的是ActiveDirectoryLdapAuthenticationProvider spring 安全性 class,因为与其他 LDAP 服务器相比,Active Directory 有其自身的细微差别。 您可能需要在安全配置 class 中使用@EnableGlobalAuthentication注释,因为您可以有多个AuthenticationManagerBuilder ,这会使事情变得很混乱。

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

        ActiveDirectoryLdapAuthenticationProvider adProvider =
                new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://primarydc.domain.com:389");
        adProvider.setConvertSubErrorCodesToExceptions(true);
        adProvider.setUseAuthenticationRequestCredentials(true);
        auth.authenticationProvider(adProvider);
}

更多细节在这里: https://github.com/spring-projects/spring-security/issues/4324 https://github.com/spring-projects/spring-security/issues/4571

解决方案是 Yaroslav Kiryak 的帖子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM