Я разработал приложение Spring Boot и хочу выполнить аутентификацию с использованием сервера LDAP.
В производстве это будет сервер Active Directory, но в процессе разработки я просто использую этот общедоступный сервер тестирования LDAP
Я получил его на работу, используя следующие классы:
Простой класс конфигурации LDAP.
Он читает из моего application.properties
файла свойства, относящиеся к содержимому LDAP.
@Configuration
public class LdapConfiguration {
//Getting values from properties file
@Value("${ldap.urls}")
private String ldapUrls;
@Value("${ldap.base.dn}")
private String ldapBaseDn;
@Value("${ldap.username}")
private String ldapSecurityPrincipal;
@Value("${ldap.password}")
private String ldapPrincipalPassword;
@Value("${ldap.user.dn.pattern}")
private String ldapUserDnPattern;
@Value("${ldap.enabled}")
private String ldapEnabled;
public LdapConfiguration() {
}
... getters and setters ...
}
И WebSecurityConfiguration, которая фактически читает из класса LdapConfiguration, чтобы использовать его для аутентификации:
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private LdapConfiguration ldapConfiguration;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and()
.formLogin();
}
// Update configure method for the online test server
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.contextSource()
.url(ldapConfiguration.getLdapUrls() +ldapConfiguration.getLdapBaseDn())
.managerDn(ldapConfiguration.getLdapSecurityPrincipal())
.managerPassword(ldapConfiguration.getLdapPrincipalPassword())
.and()
.userDnPatterns(ldapConfiguration.getLdapUserDnPattern());
}
В этих конфигурациях работает аутентификация LDAP: я получаю красивую HTML-страницу с формой входа и, используя надлежащие учетные данные, могу использовать веб-сайт.
И вот моя проблема: после фазы входа, если я запустил что-то вроде
UserDetails ud = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
System.out.println(ud);
вот что я получу:
LdapUserDetailsImpl@fd8cece1:
Dn: uid=tesla,dc=example,dc=com;
Username: tesla;
Password: [PROTECTED];
Enabled: true;
AccountNonExpired: true;
CredentialsNonExpired: true;
AccountNonLocked: true;
Granted Authorities: ROLE_SCIENTISTS
Я не получаю ничего, скажем, от полного имени Теслы (которое есть на сервере LDAP, как поле CN
).
Было бы неплохо получить все данные о проверенном пользователе.
Конечно, я могу выполнить отдельный запрос к серверу LDAP, запрашивая информацию о пользователе с именем пользователя tesla
. Однако это означает, что необходимо выполнить дополнительный запрос к серверу LDAP, поэтому это не кажется хорошим решением.
Есть ли способ указать, какие поля я хочу получить от сервера LDAP при выполнении аутентификации?
(И сильно ли он меняется при работе с сервером Active Directory?)
Заранее спасибо.