Как страницу на PHP авторизировать пользователем из Active directory?
И еще, можно ли сделать чтение пользователей/групп пользователей из той же Active directory?
Примерно так: пользователь загружает страницу, делает авторизацию, если он заходит с правами администратора в Active directory, то на страницу выложить перечень всех зарегистрированных пользователей.
if(!$ldapconnect)
{
echo "<p>Not connected to AD!</p>";
}
else
{
$ldapbind=ldap_bind($ldapconnect);
echo "<p>".$ldapbind."</p>";
}
echo "<p> Connect ".$ldapconnect."</p>"
Получаю на выходе страницу
Connect Resource id #2
hostname - там стоит реально существующий АД-сервер.
Ни под тестовым пользователем, ни анонимно зайте в АД не могу, не хочет биндиться. Хотя результат коннекта к самому АД-серверу положительный.
Что я не правильно делаю?
if($connect=@ldap_connect($ldap_server)){ // if connected to ldap server
if (ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3)) {
echo "version 3<br>\n";
} else {
echo "version 2<br>\n";
}
echo "verification on '$ldap_server': ";
// bind to ldap connection
if(($bind=@ldap_bind($connect)) == false){
print "bind:__FAILED__<br>\n";
return false;
}
// search for user
if (($res_id = ldap_search( $connect,
"dc=auto,dc=tuwien,dc=ac,dc=at",
"uid=$username")) == false) {
print "failure: search in LDAP-tree failed<br>";
return false;
}
if (ldap_count_entries($connect, $res_id) != 1) {
print "failure: username $username found more than once<br>\n";
return false;
}
if (( $entry_id = ldap_first_entry($connect, $res_id))== false) {
print "failur: entry of searchresult couln't be fetched<br>\n";
return false;
}
if (( $user_dn = ldap_get_dn($connect, $entry_id)) == false) {
print "failure: user-dn coulnd't be fetched<br>\n";
return false;
}
/* Authentifizierung des User */
if (($link_id = ldap_bind($connect, $user_dn, $password)) == false) {
print "failure: username, password didn't match: $user_dn<br>\n";
return false;
}
return true;
@ldap_close($connect);
} else { // no conection to ldap server
echo "no connection to '$ldap_server'<br>\n";
}
echo "failed: ".ldap_error($connect)."<BR>\n";
@ldap_close($connect);
return(false);
}//end function checkldapuser
Here a sample for using this function:
if (checkldapuser('myuser', 'secretpassword', 'ldap://link.to.ldap')) {
echo "ACCESS GRANTED\n";
} else {
echo "ACCESS DENIED\n";
}
Также можно читать:
Ссылка1, Ссылка2, Ссылка3, Ссылка4, Ссылка5
Пробуйте, может поможет
Но добиться биндинга так и не смог. Как я понимаю, из-за того, что в АД используются кириллические символы типа ou=Сотрудники и т.д.
Такое можно победить как-то?
Бугога! :D Знак этот как раз и подавляет сообщение об ошибке.
А на счет киррилических названий - это зря, ой, зря...:rolleyes: Переименовать низзя?
(Кстати, что обозначает вызов функции с @?)
Подавление вывода сообщения об ошибках (RTFM!!!RTFM!!!RTFM!!!RTFM!!!RTFM!!!). Применять крайне не рекомендуется если точно не уверен, что оно тебе нужно.
Такое можно победить как-то?
Может причина и в этом... в любом случае UTF-8 это наше все.
А на счет киррилических названий - это зря, ой, зря...:rolleyes: Переименовать низзя?
Для новичка главное не бояться спрашивать и запоминать, что говорят, тогда он из новичка в человека выростет 8)
Поменять нельзя, к сожалению, не моя епархия вообще.
Дайте если есть ссылок на работу LDAP с UTF-8, а то по инету пока пошарился, не видел ни одной статьи или примера.
Поменять нельзя, к сожалению, не моя епархия вообще.
Дайте если есть ссылок на работу LDAP с UTF-8, а то по инету пока пошарился, не видел ни одной статьи или примера.
Еще так же главное искать и искать:) :
Гугля: "LDAP UTF-8": :)
Вроде как раз то, что тебе надо: [COLOR=#285a99]PHP + ldap [/COLOR]
В лентяя он вырастет который сам и шагу ступить не сможет. Новичку нужно читать, ручками тестить, опять читать, читать и снова читать маны, факи и доки. И спрашивать когда уже ну ни чего из предпринятого не работает.
А использование знака @ описано в мане по PHP на русском языке.
Завтра полезу читать что в протоколах доступа может быть. Опять же, если знаете хорошие ссылки на это, посоветуйте. Гугля гуглей, а рыбные места не так просто найти. Можно 20+ страниц открыть, что бы убедиться, что на них ничего нет полезного, а читать все подряд глаза лопнут.
Принцип такой - сделал шаг, вывел сообщение ldap_err2str(...).
Проблема оказалась в самом начале. Изначально мой php-ldap оказывается работает по протоколу версии 2, которую не принимает мой сервер АД, и хотя ldap_connect якобы отрабатывает и возвращает значение Resource id#2, на самом деле соединение не происходит.
Т.е. теперь вопрос в смене протокола работы. Функция ldap_set_option не катит, она меняет значение только для уже установленного соединения. Можно ли в файле типа php.ini принудительно прописать протокол соединения LDAP 3?
Хм... лично мне думается, что используемый протокол зависит от версии расширения. Если расширение не поддерживает версию 3, то ни какие php.ini не помогут.
A N N O U N C E M E N T -- OpenLDAP 2.3
The OpenLDAP Project is pleased to announce the availability
of OpenLDAP Software 2.3, a suite of the Lightweight Directory
Access Protocol (v3) servers, clients, utilities, and
development tools.
В PHP5 php_ldap.dll имеет версию явно больше, чем 2.0, за более старые версии пыха не поручусь.
Эту опцию принудительно можно включить только если пройдет соединение типа
А оно не происходит, потому что по умолчанию стоит протокол v2. в PHP5.
Пробовал сделать
номер не прошел, хотя в примерах на php.com видел такую конструкцию.
Просто во всех примерах, которые я видел, рекомендуется включить протокол v3. но везде приведен именно такой порядок - подключить, установить протокол, пробиндиться.
P.S. Вроде сделал. Нашел такую конструкцию:
Подставил свой сервер и биндинг прошел.
Хотя опять же, есть комменты к такому вызову и написано, что такая форма обращения не всегда может сработать.
Сделал
{
header("WWW ...");
header("HTTP/1.0 401 ...");
exit;
}
получил логин и пароль. Под тестовым пользователем, в DN которого нет кириллицы зашел в AD, сделал поиск, нашел пользователя для которого выполняется условие
и получил его DN. Теперь по логике, я должен проверить, что бы у этого пользователя пароль
Пока в голову ничего лучше чем разбиндиться из-под старого тестового пользователя и забиндиться под новым не пришло. Т.е. делаю:
...
$bind=ldap_bind($ds,$login_user,$_SERVER['PHP_AUTH_PW']);
Получаю ошибку: Warning: ldap_bind() [function.ldap-bind]: Unable to bind to server: Invalid credentials
Т.е. в DN присутствует кириллица, хотя ее уже из AD присылает в Unicode UTF-8. Ругается походу именно на DN, сам код верный. Если я опять же в этот кусок запихиваю имя без кириллицы, стабильно биндится.
Вопрос такой: каким еще образом можно попытаться проверить правильность пароля, введенного на страницу с паролем из AD?
Фишка, как я понял в чем - AD ни в какую от FreeBSD не хотел принимать записи содержищие строку OU=Сотрудники, как я не бился с перекодированием ее. Попытка биндинга с полным именем типа CN=test,OU=Сотрудники,DC=... убивалась на корню. Но! Толи это фича такая, я не понял. Вобщем сделал первый вход не по полному имени, а ввел имя в формате test@..., зашло, выполнило поиск, нашло samaccountname, и потом я этот же $info[$i]["samaccountname"][0]."@..." пихнул как имя пользователя для биндинга. Прохавало! Я в шоке от силы внутренней логики ldap+AD. По принципу, раз ты меня по имени-отчеству спрашивал в первый раз, то и второй раз будь любезен, а вообще я и по имени могу, и нефиг тут французский церемониал разводить.