Spring Boot LDAP Authentication: получение пользовательских данных при аутентификации - PullRequest
0 голосов
/ 10 января 2019

Я разработал приложение 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-страницу с формой входа и, используя надлежащие учетные данные, могу использовать веб-сайт. login form

И вот моя проблема: после фазы входа, если я запустил что-то вроде

    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?)

Заранее спасибо.

...