среда, 27 марта 2013 г.

PHP: LDAP. Получение дополнительного описания ошибки LDAP в PHP

Как получить дополнительное описание ошибки LDAP в PHP на примере работы с Oracle Internet Directory 11g

Как-то в своей работе пришлось столкнуться с проблемой, что пользователи при аутентификации на php-страничке получали сообщение о неверном пароле при его верном вводе.
Как выяснилось, OID 11g возвращает одинаковый код ошибки при неверном и при устаревшем пароле.
Проблему решил с помощью анализа дополнительного описания ошибки LDAP.
Для этого в начале php-скрипта необходимо поместить строку:

define(LDAP_OPT_DIAGNOSTIC_MESSAGE, 0x0032);
А получить само выражение в переменную $extended_error с помощью функции ldap_get_option:

ldap_get_option($ds, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error) 
В моем случае еще надо было распарсить это дополнительное описание и вытащить из него код ошибки уже самого OID.
Мне нужны были вот такие дополнительные описания ошибок:

Password Policy Error :9000: GSL_PWDEXPIRED_EXCP :Your Password has expired. Please contact the Administrator to change your password.

В Oracle® Fusion Middleware Administrator's Guide for Oracle Internet Directory 11g Release 1 (11.1.1) приведены все коды ошибок OID:
http://docs.oracle.com/cd/E14571_01/oid.1111/e10029/trblsht.htm#CHDJHCHC

В итоге получается такой пример:

<?php
    define(LDAP_OPT_DIAGNOSTIC_MESSAGE, 0x0032);
    # соединение с ldap-сервером
    $ds=ldap_connect('192.168.1.1');
    if ($ds)
    {
        ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
        # выполняем bind из под пользователя
        $res=ldap_bind($ds,'cn=petrov','zzzzz');
        # проверяем успешность выполнения bind
        if (!$res)
        {
            $extended_error="";
            # получаем более подробное описание ошибки LDAP
            if (ldap_get_option($ds, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error))
            {
                # через регулярное выражение вытаскиваем номер ошибки OID
                preg_match_all("/Password Policy Error :(\d+).*/", $extended_error, $out, PREG_PATTERN_ORDER);
                switch($out[1][0])
                {
                    # GSL_PWDEXPIRED_EXCP - устаревший пароль
                    case 9000:
                        echo "9000";
                    break;
                    # GSL_PWDMUSTCHANGE_EXCP - смена пароля при первом входе
                    case 9009:
                        echo "9009";
                    break;
                    # GSL_ACCOUNTLOCKED_EXCP - блокировка из-за неудачного ввода пароля
                    case 9001:
                        echo "9001";
                    break;
                    default:
                        echo "default";
                    break;
                }
            }
        }
    }
    else
    {
echo "ldap_connect::ERROR";
    }
    ldap_close($ds);
?>

Комментариев нет:

Отправить комментарий