No sé casi nada sobre LDAP y mucho menos sobre seguridad de primavera, pero estoy tratando de configurar una aplicación de arranque de primavera para autenticarme en una instancia de ldap y estoy atascado.

Me dieron el nombre del servidor ldap en adldap.company.com y el dn base de dc = ad, dc = company, dc = com

Tengo un código de Python que hace un enlace simple y funciona.

LDAP_USERNAME = 'username@ad.company.com'
LDAP_PASSWORD = 'password'
base_dn = 'dc=ad,dc=company,dc=com' # not used for bind I guess, only search
try:
    ldap_client = ldap.initialize('ldap://adldap.company.com')
    ldap_client.set_option(ldap.OPT_REFERRALS,0)
    ldap_client.simple_bind_s(LDAP_USERNAME, LDAP_PASSWORD)
except ldap.INVALID_CREDENTIALS as e:
    ldap_client.unbind()
    return 'Wrong username and password: %s' % e
except ldap.SERVER_DOWN:
   return 'AD server not available'

Si ejecuto este código, parece que se enlaza correctamente como "username@ad.company.com" con la contraseña "contraseña".

También tengo una clase WebSecurityConfig que creo que debería manejar auth:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/secure")
            .authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and()
            .httpBasic();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .ldapAuthentication()
            .userDnPatterns("uid={0}")
            .contextSource()
            .url("ldap://adldap.company.com");
            //.url("ldap://adldap.company.com/dc=ad,dc=company,dc=com");
    }
}

Cuando voy a / secure en la aplicación, aparece una ventana emergente de autenticación básica, pero luego todo lo que intento ingresar me da un 401 No autorizado. He intentado "username@ad.company.com", sin el dominio, poniendo esas cosas en userDnPatterns como {0}@adldap.company.com y un montón de otras cosas. He intentado usar diferentes URL con el dn base o no. Nada parece funcionar. ¿Qué me estoy perdiendo?

Además, ¿es esta la forma correcta de autorizar a los usuarios? He leído acerca de la autenticación de enlace y algo sobre el enlace y la búsqueda, pero el servidor no permite enlaces anónimos, así que supongo que necesitaría algún tipo de "usuario de la aplicación" que pudiera enlazar y hacer las búsquedas, ¿verdad? Eso está mejor"?

2
MichaelB 2 nov. 2017 a las 16:59

2 respuestas

La mejor respuesta

Active Directory tiene su propia sintaxis no estándar para la autenticación de usuarios, diferente del enlace LDAP DN habitual.

Spring Security proporciona un AuthenticationProvider especializado para Active Directory.

Pruebe esto :

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .antMatcher("/secure")
            .authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and()
            .httpBasic();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
    }

    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
    }
    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("adldap.company.com", "ldap://adldap.company.com");
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        return provider;
    }
}
4
Sébastien Helbert 2 nov. 2017 a las 22:19

Para resumir, el problema es que Microsoft Active Directory LDAP no es LDAP "Vanilla" y, por lo tanto, debe conectarse de manera diferente.

La solución de trabajo está aquí: https://medium.com/@ dmarko484 / spring-boot-active-directory-authentication-5ea04969f220

0
MichaelB 2 nov. 2017 a las 17:10