Мне удалось успешно использовать 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()
, что вынуждает меня создавать экземпляр источника контекста.