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

0vvn1miw  于 2022-11-11  发布在  Spring
关注(0)|答案(2)|浏览(181)

我无法使用真实的的Active Directory进行身份验证,让我更好地解释一下我尝试使用www.example.com建议的示例进行身份验证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 - 000004 DC:登录错误:DSID-0 C 0907 C2,备注:要执行此操作,必须在连接上成功完成绑定。,data 0,v2580

wvt8vs2t

wvt8vs2t1#

是的,通过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身份验证文档

bfnvny8b

bfnvny8b2#

我在这里找到了一个样本,很有用:
https://github.com/sachin-awati/Mojito/tree/master/webapp/src/main/java/com/box/l10n/mojito/security
如果在Active Directory查找loadUserByUsername期间找不到用户,可以选择实现UserDetailsContextMapperImpl,它将覆盖mapUserFromContext以创建UserDetails对象。

@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安全类,因为Active Directory与其他LDAP服务器相比有其自身的细微差别。您可能需要在安全配置类中使用@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/4324https://github.com/spring-projects/spring-security/issues/4571

相关问题