Разграничение причин InvalidAttributeValueException - PullRequest
2 голосов
/ 23 февраля 2012

Я пытаюсь определить с помощью экземпляра InvalidAttributeValueException, что послужило причиной для кода ошибки LDAP 19 (ошибка политики паролей), поэтому я смогу отобразить информативное сообщение об ошибке в пользовательском интерфейсе.

Текущий сервис LDAP, который я использую, - openLDAP (как встроенный LDAP в приложении), и он предоставляет довольно информативное сообщение, которое было достаточно хорошим для отображения (т.е. "[LDAP: error code 19 - Password fails quality checking policy]" & "[LDAP: error code 19 - Password is in history of old passwords]")

НоТеперь я хочу поддержать Active Directory и других провайдеров LDAP (которые будут внешними), и из того, что я видел в rfc2251 и различных других источниках - каждая реализация выдает свое собственное сообщение об исключении, и единственной стандартной вещью является отображение кода ошибки 19на InvalidAttributeValueException, а не на конкретную проблему.

Существует ли решение (даже частичное) для различения различных причин кода ошибки 19?Есть ли способ, учитывая экземпляр InvalidAttributeValueException, запросить у LDAP ответ на этот вопрос?

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Мои комментарии выше относятся к универсальному LDAP API, но я забыл кое-что важное. Вам необходимо изучить элементы управления запросами и ответами, указанные в http://tools.ietf.org/html/draft-behera-ldap-password-policy-10.. Это работает в OpenLDAP, но я не могу сказать, поддерживается ли он Active Directory. У меня есть Java JNDI-код, который поддерживает его, вы можете. PasswordPolicyResponseControl может возвращать следующее:

/** Warning codes. */
public enum Warning
{
    /** Password expiration warning.*/
    timeBeforeExpiration,
    /** Grace logins warning.*/
    graceAuthNsRemaining,
    none;
}

/** Error codes. */
public enum Error
{
    /** The password has expired.*/
    passwordExpired,
    /**
     * The account has been locked, either by an administrator
     * or as a result of too many failed login attempts.
     */
    accountLocked,
    /**
     * The password has been reset by an administrator and must be changed immediately.
     */
    changeAfterReset,
    /**
     * The password policy does not permit the user to change his password.
     */
    passwordModNotAllowed,
    /**
     * The password policy requires the old password to be supplied
     * when changing passwords.
     * This indicates a programming error in the client.
     */
    mustSupplyOldPassword,
    /**
     * The new password has failed the quality check.
     */
    insufficientPasswordQuality,
    /**
     * The new password is too short.
     */
    passwordTooShort,
    /**
     * The current password is too new to change yet.
     */
    passwordTooYoung,
    /**
     * The password policy specifies keeping a password history
     * and the new password is already in it.
     */
    passwordInHistory,
    /**
     * Error parsing the response control.
     * This indicates a programming error either in this
     * class or in the LDAP server.
     */
    unparseableResponseControl,
    /**
     * No additional information.
     * This can be seen e.g. when the user simply logs
     * in with the wrong password.
     */
    none;
};
0 голосов
/ 25 февраля 2012

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

  • Причина, которая будет зависеть от реализации, приведена в варианте конструктора

InvalidAttributeValueException(String explanation)

  • у него есть метод для его вызова:

exception.getExplanation()

, который дает значениес конструктором.

Поскольку конструктор принимает значение как String, а не enum, может оказаться невозможным попытаться получить список значений, которые каждый кодер присвоил этому значению при кодировании различных решений.Итак, как вы выяснили, все пишут то, что считают нужным: все по-разному и, следовательно, пишут разные вещи.

Вот что я могу сказать по спецификациям.

...