Ошибки политики паролей не выдаются с помощью LDAP Spring Security

Я новичок в Spring Security с LDAP, и я пытаюсь пройти аутентификацию с пользователем, срок действия пароля которого истек на сервере LDAP (FreeIPA).

Кажется, я не могу вызвать какое-либо исключение с истекшим сроком действия пароля и т. Д. Элементы управления ответом политики паролей всегда возвращают значение null ....

Вот мой код, возможно я что-то не так делаю. Как обрабатывать ошибки политики паролей? В настоящее время они вообще не стреляют.

<bean id="freeIpaContextSource" class="org.springframework.security.ldap.ppolicy.PasswordPolicyAwareContextSource">
    <constructor-arg value="${logon.freeipa.zone.ldap.connection.url}"/>
    <property name="base" value="${logon.freeipa.zone.user.dn.base}"/>
</bean>

<bean id="freeIpaLdapTemplate" class="org.springframework.security.ldap.SpringSecurityLdapTemplate">
    <constructor-arg name="contextSource" ref="freeIpaContextSource"/>
</bean>

У меня есть собственный LdapAuthenticator ниже, который использует ldaptemplate для аутентификации пользователей.

@Override
public DirContextOperations authenticate(Authentication authentication) {
    checkForIllegalStateDuringAuthentication(authentication);
    logger.info(String.format("*** Beginning to authenticate against LDAP zone %s ***", authorizationZone.getName()));
    zoneAuthenticationService.saveRequestDataInSession((UsernamePasswordAuthenticationToken) authentication, authorizationZone.getName());
    CollectingAuthenticationErrorCallback errorCallback = new CollectingAuthenticationErrorCallback();
    boolean isAuthenticated = false;
    String userName = authentication.getName();
    String password = authentication.getCredentials().toString();
    String filterLookup = buildLDAPFilterLookupString(userName);
    if (StringUtils.isNotBlank(password)) {
        logger.info(String.format("*** Attempting authentication for user %s ***", userName));
        try {
            isAuthenticated = ldapTemplate.authenticate(StringUtils.EMPTY, filterLookup, password, errorCallback);

        } catch (Exception exception) {
            errorCallback.execute(exception);
        }
    }
    if (!isAuthenticated) {
        if (errorCallback.getError() == null) {
            errorCallback.execute(new AuthenticationException(null));
        }
        //Any LDAP exception caught are stored inside the errorCallBack for use later to display an appropriate error.
        logger.error(String.format("*** Authentication for user %s has failed. Exception has occurred while system performed LDAP authentication. ***", userName), errorCallback.getError());
        throw new LdapAuthenticationException(errorCallback.getError().getMessage(), errorCallback.getError());
    }
    logger.info(String.format("*** Authentication for user %s has succeeded ***", userName));
    return new DirContextAdapter(buildAuthenticatedDN(userName));
}

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

LdapContext context = (LdapContext)ldapTemplate.getContextSource().getContext(buildAuthenticatedDN(userName).toString(), password);
Control[] rctls = new Control[]{new PasswordPolicyControl(false)};
context.reconnect(rctls);
PasswordPolicyResponseControl ctrl = PasswordPolicyControlExtractor.extractControl(context);
//ctrl is always null
 if (ctrl.isExpired()) {
                throw new 
PasswordPolicyException(ctrl.getErrorStatus());
            }

Что я делаю не так? Я очень борюсь с этим, и любая помощь будет очень признательна.


person Brandon Nolan    schedule 18.09.2018    source источник


Ответы (1)


Если ваш клиент действительно отправляет правильный ответ, вы можете столкнуться с этой проблемой (открытой с 7 лет):

#1539 [RFE] Добавить код для проверки срока действия пароля при привязке ldap

IIRC FreeIPA обеспечивает истечение срока действия пароля только во время предварительной аутентификации Kerberos (kinit).

person Michael Ströder    schedule 19.09.2018
comment
Спасибо за это. Я видел что-то с KerberosContextSource онлайн. Возможно, я попытаюсь реализовать это в будущем. - person Brandon Nolan; 25.09.2018