Я пишу код php для подключения к моему серверу LDAP.
$adServer = $ini['ldap'];
$ldap = ldap_connect($adServer) or die("Could not connect to {$adServer}");
Значение для $adServer
Я загружаю из файла конфигурации.
Похоже ldap_connect()
не выдает ошибку, когда я передаю пустое значение или любое другое случайное значение, такое как «Hello».
Я попытался дать приведенный ниже код, чтобы проверить, было ли сгенерировано какое-либо сообщение об ошибке.
echo ldap_error($ldap)
Это всегда говорит «Успех».
Следовательно, я не могу проверить подлинность соединения с LDAP-сервером и установить соответствующее сообщение об ошибке.
В какой ситуации срабатывает «умереть» ldap_connect()
функция.
Я хотел бы выдать соответствующее сообщение об ошибке конечному пользователю, если имя сервера, указанное в файле конфигурации, не работает.
Примечание: я использую версию 5.6 для PHP
ldap_connect()
всегда возвращает ресурс, когда он может проанализировать предоставленный параметр как URL. Первый раз, когда ресурс фактически используется (и, следовательно, устанавливается соединение, и возможный сбой может быть обнаружен), это когда используется ldap_bind()
,
Как ldap_connect()
почти всегда возвращает дескриптор ресурса (как описано в http://php.net/ldap_connect) ваша конструкция с die()
не будет делать то, что вы хотите. Это будет работать только в том случае, если указанный параметр не может быть внутренне проанализирован как URL. так что пока вы предоставляете строку, которая выглядит как имя сервера или URL, все работает.
Я всегда проверяю после неудачного ldap_bind()
что именно произошло, а затем выдать исключение в зависимости от ошибки, возвращенной. В качестве альтернативы я иногда проверяю перед использованием ldap_bind()
открыв (и просто закрыв) соединение с помощью f.i fsockopen()
, Если это соединение не может быть открыто, ldap-соединение также не будет работать.
Примеры упомянутой php-документации ошибочны, и, похоже, нам придется их изменить. Так что спасибо за то, что обнаружили и подбросили вопрос!
Кстати: звонит @ldap_connect('ldap:');
например, был бы такой случай, когда die()
будет работать, так как это неполный URL. Или используя строку с пробелами.
Я нашел лучший способ сделать аутентификацию вместо использования die.
После подключения ldap мы продолжаем использовать ldap bind. Если привязка не удалась, мы можем проверить ошибку ldap.
$ldap = @ldap_connect($adServer);
$bind = @ldap_bind ($ldap, $ldaprdn, $password);
if (!$bind) { // If Bind Failed then.
if (ldap_errno ($ldap) == 49 {
//Invalid Credentials
} else {
//LDAP Connection to LDAP Server Failed
}
}
Для получения списка всех номеров ошибок LDAP, вы можете проверить Вот