2017-02-17 22 views
0

Для настройки безопасности Spring в Spring Boot. Поставщик аутентификации LDAP по умолчанию настроен на использование класса BindAuthenticator.Как справиться с BindAuthenticator handleBindException для Spring Настройка аутентификации LDAP в Spring Boot

Этот класс содержит метод

/** 
* Allows subclasses to inspect the exception thrown by an attempt to bind   with a 
* particular DN. The default implementation just reports the failure to  the debug 
* logger. 
*/ 
protected void handleBindException(String userDn, String username,  Throwable cause) { 
if (logger.isDebugEnabled()) { 
logger.debug("Failed to bind as " + userDn + ": " + cause); 
} 
} 

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

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

Текущая реализация LDAP всегда возвращает «Bad Credentials», которая не дает правильного изображения, почему мои учетные данные недействительны. я хочу, чтобы покрыть случаи

  1. где счет закрыт
  2. пароля с истекшим сроком годности, так что я могу переадресовать изменить пароль
  3. счет заблокирован в связи с числом недействительных пароля повторит

Пожалуйста, помогите

+0

Должен ли он ... Вы действительно хотите вернуть это конечному пользователю? С точки зрения безопасности, вы не хотите раскрывать эту информацию. Если учетная запись заблокирована, хакер теперь знает, что имеет действительное имя пользователя. То же самое вы говорите ему, что пароль неверен или если имя пользователя не существует. –

+0

@Denium Я создаю это для внутреннего приложения, только сотрудник может получить доступ к интрасети. Так что это ожидание от моего продукта Owner :) – Ahsan

+1

С точки зрения безопасности это не имеет значения. Кто говорит, что все пользователи хорошо согласны, что насчет недовольных сотрудников.Я могу представить, что вам может понадобиться эта информация в ваших журналах, но вы хотите быть настолько универсальной для внешнего мира. –

ответ

1

Проблема, которую я исправил, определяя контекст LDAP вместо использования Spring Boot LDAPAuthenticationProviderConfigurer.

Затем создал фильтр FilterBasedLdapUserSearch и переписан BindAuthentication с помощью моего ConnectBindAuthenticator.

Я создал отдельный класс LDAPConfiguration для конфигурации весенней загрузки и зарегистрировал все эти пользовательские объекты как Beans.

Из приведенных выше объектов я создал LDAPAuthenticationProvider, передавая мои пользовательские объекты конструктору

конфиге как ниже

@Bean 
public DefaultSpringSecurityContextSource contextSource() { 
    DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(env.getProperty("ldap.url")); 
    contextSource.setBase(env.getProperty("ldap.base")); 
    contextSource.setUserDn(env.getProperty("ldap.managerDn")); 
    contextSource.setPassword(env.getProperty("ldap.managerPassword")); 
    return contextSource; 
} 

@Bean 
public ConnectBindAuthenticator bindAuthenticator() { 
    ConnectBindAuthenticator connectBindAuthenticator = new ConnectBindAuthenticator(contextSource()); 
    connectBindAuthenticator.setUserSearch(ldapUserSearch()); 
    connectBindAuthenticator.setUserDnPatterns(new String[]{env.getProperty("ldap.managerDn")}); 
    return connectBindAuthenticator; 
} 

@Bean 
public LdapUserSearch ldapUserSearch() { 
    return new FilterBasedLdapUserSearch("", env.getProperty("ldap.userSearchFilter"), contextSource()); 
} 
0

Вы должны изменить конфигурацию безопасности пружины, чтобы добавить расширение BindAuthenticator:

CustomBindAuthenticator.java

public class CustomBindAuthenticator extends BindAuthenticator { 

    public CustomBindAuthenticator(BaseLdapPathContextSource contextSource) { 
     super(contextSource); 
    } 

    @Override 
    protected void handleBindException(String userDn, String username, Throwable cause) { 
     // TODO: Include here the logic of your custom BindAuthenticator 
     if (somethingHappens()) { 
      throw new MyCustomException("Custom error message"); 
     } 

     super.handleBindException(userDn, username, cause); 
    } 
} 

весна-security.xml

<beans:bean id="contextSource" 
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <beans:constructor-arg value="LDAP_URL" /> 
    <beans:property name="userDn" value="USER_DN" /> 
    <beans:property name="password" value="PASSWORD" /> 
</beans:bean> 

<beans:bean id="userSearch" 
    class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> 
    <beans:constructor-arg index="0" value="USER_SEARCH_BASE" /> 
    <beans:constructor-arg index="1" value="USER_SEARCH_FILTER" /> 
    <beans:constructor-arg index="2" ref="contextSource" /> 
</beans:bean> 

<beans:bean id="ldapAuthProvider" 
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <beans:constructor-arg> 
     <beans:bean class="com.your.project.CustomBindAuthenticator"> 
      <beans:constructor-arg ref="contextSource" /> 
      <beans:property name="userSearch" ref="userSearch" /> 
     </beans:bean> 
    </beans:constructor-arg> 
</beans:bean> 

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="ldapAuthProvider" /> 
</security:authentication-manager> 

Надеется, что это полезно.