Как реализовать авторизацию с мобильного приложения на сервере (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();
}
Такая реализация имеет следующие недостатки:
- Пароль и логин жестко фиксированы, а если использовать SecurityContextHolder.getContext().getAuthentication().getName() - мы получаем Null
- Также, авторизация данного формата работает через раз и получаем 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 шт):
Попробую рассказать обо всём по порядку.
Проблема 1.
Использовать HttpBasic, особенно для мобильного клиента, очень плохая идея. Используйте токены. И заодно напишите для Spring Security нормальную обвязку с фильтром и провайдером.
Плюс, что Вам мешает запрашивать данные из LDAP отдельно при помощи LdapContext?
Проблема 2 может возникать если в сессии сохраняется состояние. Отключить его сохранение можно так:
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)