Весенняя загрузка безопасности ldap

Здравствуйте, у меня проблема с созданием простого входа в систему с помощью Ldap. Я скачал проект «Начало работы» с веб-сайта spring.io: Начало работы с LDAP.

Он отлично работает с файлом ldif, но я хочу заменить его работающим сервером ldap. Я пробовал это в течение нескольких дней без прогресса. Я получаю наилучшие результаты с этим фрагментом кода (заменен в WebSecurityConfig в начале проекта)

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
 
    @Override
    protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
        authManagerBuilder.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailsService());
    }
 
    @Bean
    public AuthenticationManager authenticationManager() {
        return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
    }
    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(null, "ldap://ip:port/", "ou=GROUP,dc=domain,dc=com");
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
 
        return provider;
    }
}

Если я попытаюсь войти в систему с правильным именем пользователя и паролем в формате, вывод консоли пароля имени пользователя: ActiveDirectoryLdapAuthenticationProvider: Ошибка аутентификации Active Directory: Предоставленный пароль недействителен

Если я использую имя пользователя@домен.com и хороший пароль, страница просто перезагружается без вывода на консоль.

Если я использую случайное имя пользователя и пароль консоли: аутентификация Active Directory не удалась: предоставленный пароль недействителен

Кто-нибудь может помочь?


person user3551808    schedule 14.02.2017    source источник
comment
Поскольку вы использовали «null» для домена в конструкторе ActiveDirectoryLdapAuthenticationProvider , вы должны использовать «userPrincipalName» ([email protected]) для аутентификации. Вы можете включить ведение журнала, чтобы узнать, почему это не работает или если вы не используйте расширенную операцию LDAPS или StartTLS, сетевая трассировка точно скажет, успешно ли выполнен запрос LDAP BIND   -  person Bernhard Thalmayr    schedule 15.02.2017


Ответы (1)


Как было предложено в комментарии, я включил ведение журнала и обнаружил, что проблема такая же и с именем пользователя @domain.com.

Проблема была в aciveDirectoryLdapAuthenticationProvider(), в ней было 3 проблемы.

  1. Я удалил группу OU из rootDn и добавил домен, чтобы мы могли использовать только имя пользователя для входа в систему.
ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://ip:port/", "dc=domain,dc=com");
  1. изменен поисковый фильтр провайдера
provider.setSearchFilter("(&(objectClass=user)(sAMAccountName={0}))");
  1. и, наконец, мне пришлось изменить метод ActiveDirectoryLdapAuthProvider searchForUser, потому что он совпадал с [email protected] с sAMAccountName вместо имени пользователя. Этот:
return SpringSecurityLdapTemplate.searchForSingleEntryInternal(context,
                    searchControls, searchRoot, searchFilter,
                    new Object[] { bindPrincipal });    

заменено на это:

return SpringSecurityLdapTemplate.searchForSingleEntryInternal(context,
                searchControls, searchRoot, searchFilter,
                new Object[] { username }); 

Завершите aciveDirectoryLdapAuthenticationProvider:

    @Bean
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://ip:port/", "dc=domain,dc=com");  
        provider.setSearchFilter("(&(objectClass=user)(sAMAccountName={0}))");
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        return provider;
    }

Может ли кто-нибудь предложить лучшее решение для второй/третьей проблемы? может лучше поисковый фильтр? У меня нет поля в ldap, которое соответствует формату [email protected] bindPrincipal, который использует ActiveDirectoryLdapAuthProvider.

person user3551808    schedule 17.02.2017
comment
Привет, @user3551808, подскажи, пожалуйста, как и где ты включил ведение журнала? У меня есть похожие ошибки, и я хочу видеть больше журналов, но этого не происходит, я использую logback.xml, и я просто сделал эту запись в начале logback.xml:'debug=true, но это не так. вроде помогает. - person soMuchToLearnAndShare; 19.05.2017
comment
Чтобы включить ведение журнала logging.level.org.springframework.security: DEBUG - person cmptrwizard; 12.07.2018
comment
Я использовал broadleafcommerce.com/ docs/core/5.2/tutorials/ для пользовательского ldapAuthenticatorProvider, и это сработало. - person Sylhare; 30.09.2020