Как реализовать авторизацию с мобильного приложения на сервере (Spring + Ldaps)?

Требуется реализовать авторизацию пользователя с мобильного приложения на сервере. Пользователей завели в Ldap + SSl. В данным момент реализация имеет следующий вид:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    auth.ldapAuthentication()
            .contextSource()
            .url(URL)
            .managerDn("username")
            .managerPassword("123")
            .and()
            .userDnPatterns(DN_PATTRNS);

}


@Override
protected void configure(HttpSecurity http) throws Exception {

    http
        .csrf().disable()
        .authorizeRequests()
            .antMatchers("/auth").authenticated()
            .anyRequest().permitAll()
        .and()
        .httpBasic();

}

Такая реализация имеет следующие недостатки:

  1. Пароль и логин жестко фиксированы, а если использовать SecurityContextHolder.getContext().getAuthentication().getName() - мы получаем Null
  2. Также, авторизация данного формата работает через раз и получаем Exception и ошибку 401(Unauthorized): simple bind failed: hostname:636; nested exception is javax.naming.CommunicationException: simple bind failed: hostname:636 [Root exception is java.net.SocketException: Connection reset]

Был бы невероятно благодарен за помощь и объяснения проблемы.


Ответы (1 шт):

Автор решения: Streletz

Попробую рассказать обо всём по порядку.

Проблема 1. Использовать HttpBasic, особенно для мобильного клиента, очень плохая идея. Используйте токены. И заодно напишите для Spring Security нормальную обвязку с фильтром и провайдером.

Плюс, что Вам мешает запрашивать данные из LDAP отдельно при помощи LdapContext?

Проблема 2 может возникать если в сессии сохраняется состояние. Отключить его сохранение можно так:

.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
→ Ссылка