Spring Boot LDAP Authentication: получение данных пользователя при аутентификации

Я разработал приложение 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

Я ничего не понимаю, скажем, о полном имени Tesla (которое указано на сервере LDAP как поле CN). Было бы неплохо получить все данные об аутентифицированном пользователе.

Конечно, я могу запустить отдельный запрос к серверу LDAP, задав подробности о пользователе с именем пользователя tesla. Однако это означает выполнение дополнительного запроса к серверу LDAP, поэтому это не кажется хорошим решением.

Есть ли способ указать, какие поля я хочу получать от сервера LDAP при выполнении аутентификации? (И сильно ли он меняется при работе с сервером Active Directory?)

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

На это ответили здесь: stackoverflow.com/questions/54242165/…

spourdas 18.01.2019 21:40
1
1
2 915
0

Другие вопросы по теме