Как переопределить BindAuthenticator handleBindException для настройки аутентификации Spring LDAP в Spring Boot

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

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

/**
* 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 всегда возвращает «Неверные учетные данные», что не дает правильного представления о том, почему мои учетные данные недействительны. я хочу покрыть случаи

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

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


person Ahsan    schedule 17.02.2017    source источник
comment
Если это... Вы действительно хотите вернуть это своему конечному пользователю? С точки зрения безопасности вы не хотите раскрывать эту информацию. Если учетная запись заблокирована, хакер теперь знает, что у нее действительное имя пользователя. То же самое вы говорите ему, что пароль неверен или если имя пользователя не существует.   -  person M. Deinum    schedule 17.02.2017
comment
@Denium Я создаю это для внутреннего приложения, только сотрудник может получить доступ к интрасети. Так что это ожидание от моего владельца продукта :)   -  person Ahsan    schedule 17.02.2017
comment
С точки зрения безопасности это не имеет значения. Кто сказал, что все пользователи доброжелательны, а недовольные сотрудники. Я могу представить, что вам может понадобиться эта информация в ваших журналах, но вы хотите быть как можно более общим для внешнего мира.   -  person M. Deinum    schedule 17.02.2017
comment
Истинный. но по многим причинам либо ведение журнала, либо большая видимость для моих корпоративных внутренних пользователей. Должен быть способ расширить это. на данный момент в весенней конфигурации загрузки для режима безопасности это кажется невозможным.   -  person Ahsan    schedule 17.02.2017
comment
Также другие возможности использования, такие как просроченный пароль. где учетные данные действительны. и учетная запись заблокирована, где снова действительны учетные данные. Я не могу зафиксировать случаи.   -  person Ahsan    schedule 17.02.2017
comment
В зависимости от того, что вы делаете, все уже зарегистрировано, и снова вы не хотите сообщать хакеру, что учетная запись заблокирована или срок действия пароля истек. Это значит, что он на месте. Даже если может показаться, что приложение видно только в локальной интрасети. Кроме того, Spring Security уже ведет много журналов этого (если вы его включили) и, как указано в javadoc, если вы хотите, чтобы что-то еще расширило этот класс и настроило Spring Security для его использования.   -  person M. Deinum    schedule 17.02.2017


Ответы (2)


Проблема, которую я исправил, определив контекст 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());
 }
person Ahsan    schedule 24.02.2017

Вам нужно изменить конфигурацию безопасности spring, чтобы добавить расширение 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);
    }
}

spring-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>

Надеюсь, это полезно.

person Alavaros    schedule 15.02.2018