2015-08-19 2 views
0

Я пытался настроить Spring Security для работы с LDAP с небольшим успехом.Spring Security + LDAP всегда возвращает BadCredentialsException

У меня есть следующие бобы конфигурации:

@Bean 
public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 

    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("go.com.mt", "LDAP://CORPORATE.INTRA"); 
    provider.setConvertSubErrorCodesToExceptions(true); 
    provider.setUseAuthenticationRequestCredentials(true); 
    provider.setUserDetailsContextMapper(userDetailsContextMapper()); 
    return provider; 
} 

@Bean 
public UserDetailsContextMapper userDetailsContextMapper() { 
    UserDetailsContextMapper contextMapper = new AttributesLDAPUserDetailsContextMapper(); 
    return contextMapper; 
} 

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()); 
} 

Я попытался создать пользовательский картографа, как было предложено много ответов здесь на переполнение стека, которая устанавливает все полномочия ROLE_USER

public class AttributesLDAPUserDetailsContextMapper implements UserDetailsContextMapper { 
    @Override 
    public UserDetails mapUserFromContext(DirContextOperations dirContextOperations, String username, Collection<? extends GrantedAuthority> authority) { 
     List<GrantedAuthority> mappedAuthorities = new ArrayList<GrantedAuthority>(); 
     for (GrantedAuthority granted : authority) { 
      if (true) { 
       mappedAuthorities.add(() -> "ROLE_USER"); 
      } else if(granted.getAuthority().equalsIgnoreCase("MY ADMIN GROUP")) { 
       mappedAuthorities.add(() -> "ROLE_ADMIN"); 
      } 
     } 
     return new User(username, "", mappedAuthorities); 
    } 

    @Override 
    public void mapUserToContext(UserDetails userDetails, DirContextAdapter dirContextAdapter) { 

    } 
} 

При попытке аутентификации с существующим пользователем и неправильным паролем я получаю следующее сообщение:

[apr-8080-exec-6] ctiveDirectoryLdapAuthenticationProvider : Active Directory authentication failed: Supplied password was invalid 
[apr-8080-exec-6] o.s.b.a.audit.listener.AuditListener  : AuditEvent [timestamp=Thu Aug 20 07:31:59 CEST 2015, principal=samantha.catania, type=AUTHENTICATION_FAILURE, data={type=org.springframework.security.authentication.BadCredentialsException, message=Bad credentials}] 

означает, что активный каталог время работает правильно, но при попытке аутентификации с правильными учетными данными, которые я получаю следующее сообщение:

[pr-8080-exec-10] o.s.s.ldap.SpringSecurityLdapTemplate : Ignoring PartialResultException 
[pr-8080-exec-10] o.s.b.a.audit.listener.AuditListener  : AuditEvent [timestamp=Thu Aug 20 07:32:05 CEST 2015, principal=samantha.catania, type=AUTHENTICATION_FAILURE, data={type=org.springframework.security.authentication.BadCredentialsException, message=Bad credentials}] 

Любые идеи, как это исправить, пожалуйста?

+0

Проверьте, есть ли коллекция полномочия пустые или нулевые. Лемм знает. –

+0

Я добавил журналы для обоих методов сопоставления, но они никогда не печатаются. Я также добавил точки останова, и он никогда не останавливается там @. @ –

+0

Где и какие методы сопоставления. Можете ли вы быть немного более точными ... Простой цикл if-else, чтобы проверить, является ли список предоставленных полномочий пустым или нет, что я хочу знать. –

ответ

0

Проблема заключалась в том, что ActiveDirectoryLdapAuthenticationProvider «угадывал» DN, используя домен. Обновление spring-security-ldap в версии латтестов имело доступ к new constructor with 3 parameters, где последний позволяет указать DN. После этого картограф начал успешно вызваться, и аутентификация прошла.

Я хотел бы поблагодарить всех, кто внес свой вклад:

0

Попробуйте использовать настройки Java-среду свойства «java.naming.referral», чтобы «следовать» (либо в коде при запуске, или с помощью аргумента JVM -Djava.naming.referral = следующим образом.

Вы получаете трассировку стека или можете ли вы печатать исключение BadCredentialsException?

Это очень похоже на проблему, с которой я сталкивался с AD, где проблема заключалась в том, как AD обрабатывает рефералы, и это приведет к возникновению ошибок при извлечении данных.

От того, что вы опубликовали, я ожидаю, что исключение будет создано в ActiveDirectoryLdapAuthenticationProvider.java line 323, что будет p в том же вопросе.

Смежные вопросы