Spring Security LDAP - использование AuthenticationManagerBuilder отклоняет контекст - PullRequest
0 голосов
/ 25 сентября 2018

Мне удалось успешно использовать LDAP для извлечения пользователей из ActiveDirectory.Однако для этого мне пришлось вручную создать экземпляр BaseLdapPathContextSource следующим образом:

Рабочая конфигурация безопасности Spring:

@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 s применяются к нему после сборки beign.Однако большинство из них - просто bean-компоненты с автопроводкой.

Журнал предоставляется при неудачной аутентификации (которая должна была пройти успешно):

2018-09-25 15:45: 25.679 DEBUG 10784 --- [nio-8080-exec-3] ossauthentication.ProviderManager: попытка аутентификации с использованием org.springframework.security.ldap.authentication.LdapAuthenticationProvider

2018-09-25 15:45:25.680 DEBUG 10784 --- [nio-8080-exec-3] osslaLdapAuthenticationProvider: Обработка запроса аутентификации для пользователя: mcurrao

2018-09-25 15: 45: 25.689 DEBUG 10784 --- [nio-8080-exec-3] osslaBindAuthenticator: Попытка связать как ou = factory

2018-09-25 15: 45: 25.689 DEBUG 10784 --- [nio-8080-exec-3] sslDefaultSpringSecurityContextSource: удаление флага пула для пользователяou = [my_ou]

2018-09-25 15: 45: 25.694 DEBUG 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: аутентификация LDAP не работает, если я использую предоставленный компоновщик contextSource(), что вынуждает меня создавать экземпляр источника контекста.

...