Как получить дополнительное описание ошибки 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);
?>
Комментариев нет:
Отправить комментарий