Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как страницу на PHP авторизировать пользователем из Active directory?

30K
11 сентября 2007 года
Dagas
11 / / 10.09.2007
Видел подобную реализацию, но сам такого не делал. Если есть, дайте, пожалуйста, свои примеры или ссылки на статьи.
И еще, можно ли сделать чтение пользователей/групп пользователей из той же Active directory?
Примерно так: пользователь загружает страницу, делает авторизацию, если он заходит с правами администратора в Active directory, то на страницу выложить перечень всех зарегистрированных пользователей.
353
11 сентября 2007 года
Nixus
840 / / 04.01.2007
Капать в сторону ldap модуля.
30K
18 сентября 2007 года
Dagas
11 / / 10.09.2007
Код:
$ldapconnect=ldap_connect(hostname);
if(!$ldapconnect)
 {
  echo "<p>Not connected to AD!</p>";
 }
else
 {
  $ldapbind=ldap_bind($ldapconnect);
  echo "<p>".$ldapbind."</p>";
 }
echo "<p> Connect ".$ldapconnect."</p>"


Получаю на выходе страницу

Цитата:
Warning: ldap_bind() [function.ldap-bind]: Unable to bind to server: Can't contact LDAP server in /usr/local/www/apache22/data/phpldapadmin/index.php on line 9

Connect Resource id #2



hostname - там стоит реально существующий АД-сервер.
Ни под тестовым пользователем, ни анонимно зайте в АД не могу, не хочет биндиться. Хотя результат коннекта к самому АД-серверу положительный.

Что я не правильно делаю?

251
18 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Код:
function checkldapuser($username,$password,$ldap_server){
  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
Пробуйте, может поможет
30K
18 сентября 2007 года
Dagas
11 / / 10.09.2007
Использование
 
Код:
=@ldap_bind(
немного помогло, спасибо - исчезло указание на ошибку в коде. (Кстати, что обозначает вызов функции с @?)

Но добиться биндинга так и не смог. Как я понимаю, из-за того, что в АД используются кириллические символы типа ou=Сотрудники и т.д.
Такое можно победить как-то?
251
18 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Цитата: Dagas
Использование
 
Код:
=@ldap_bind(
немного помогло, спасибо - исчезло указание на ошибку в коде. (Кстати, что обозначает вызов функции с @?)


Бугога! :D Знак этот как раз и подавляет сообщение об ошибке.
А на счет киррилических названий - это зря, ой, зря...:rolleyes: Переименовать низзя?

12
18 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Dagas

(Кстати, что обозначает вызов функции с @?)


Подавление вывода сообщения об ошибках (RTFM!!!RTFM!!!RTFM!!!RTFM!!!RTFM!!!). Применять крайне не рекомендуется если точно не уверен, что оно тебе нужно.

Цитата: Dagas
Но добиться биндинга так и не смог. Как я понимаю, из-за того, что в АД используются кириллические символы типа ou=Сотрудники и т.д.
Такое можно победить как-то?


Может причина и в этом... в любом случае UTF-8 это наше все.

30K
18 сентября 2007 года
Dagas
11 / / 10.09.2007
Цитата: SkyM@n
Бугога! :D Знак этот как раз и подавляет сообщение об ошибке.
А на счет киррилических названий - это зря, ой, зря...:rolleyes: Переименовать низзя?



Для новичка главное не бояться спрашивать и запоминать, что говорят, тогда он из новичка в человека выростет 8)

Поменять нельзя, к сожалению, не моя епархия вообще.
Дайте если есть ссылок на работу LDAP с UTF-8, а то по инету пока пошарился, не видел ни одной статьи или примера.

251
18 сентября 2007 года
SkyMаn
1.7K / / 31.07.2007
Цитата: Dagas
Для новичка главное не бояться спрашивать и запоминать, что говорят, тогда он из новичка в человека выростет 8)

Поменять нельзя, к сожалению, не моя епархия вообще.
Дайте если есть ссылок на работу LDAP с UTF-8, а то по инету пока пошарился, не видел ни одной статьи или примера.


Еще так же главное искать и искать:) :
Гугля: "LDAP UTF-8": :)
Вроде как раз то, что тебе надо: [COLOR=#285a99]PHP + ldap [/COLOR]

12
18 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Dagas
Для новичка главное не бояться спрашивать и запоминать, что говорят, тогда он из новичка в человека выростет 8)


В лентяя он вырастет который сам и шагу ступить не сможет. Новичку нужно читать, ручками тестить, опять читать, читать и снова читать маны, факи и доки. И спрашивать когда уже ну ни чего из предпринятого не работает.
А использование знака @ описано в мане по PHP на русском языке.

30K
19 сентября 2007 года
Dagas
11 / / 10.09.2007
Подключил php5-iconv - перевел строку в UTF-8, потом создал пользователя, в DN которого нет кириллицы, все равно гибнет на биндинге, выдает ошибку:
Цитата:
LDAP_PROTOCOL_ERROR A protocol violation was detected.


Завтра полезу читать что в протоколах доступа может быть. Опять же, если знаете хорошие ссылки на это, посоветуйте. Гугля гуглей, а рыбные места не так просто найти. Можно 20+ страниц открыть, что бы убедиться, что на них ничего нет полезного, а читать все подряд глаза лопнут.

30K
20 сентября 2007 года
Dagas
11 / / 10.09.2007
Вобщем, проверил работу этой всей системы пошагово.
Принцип такой - сделал шаг, вывел сообщение ldap_err2str(...).
Проблема оказалась в самом начале. Изначально мой php-ldap оказывается работает по протоколу версии 2, которую не принимает мой сервер АД, и хотя ldap_connect якобы отрабатывает и возвращает значение Resource id#2, на самом деле соединение не происходит.
Т.е. теперь вопрос в смене протокола работы. Функция ldap_set_option не катит, она меняет значение только для уже установленного соединения. Можно ли в файле типа php.ini принудительно прописать протокол соединения LDAP 3?
12
20 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Dagas
Можно ли в файле типа php.ini принудительно прописать протокол соединения LDAP 3?


Хм... лично мне думается, что используемый протокол зависит от версии расширения. Если расширение не поддерживает версию 3, то ни какие php.ini не помогут.

12
20 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Огласи версию LDAP расширения. Например в OpenLDAP 2.3 поддежка протокола версии 3 есть.
Цитата:

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.

12
20 сентября 2007 года
alekciy
3.0K / / 13.12.2005
Короче выяснил я следущее. В OpenLDAP поддежка V3 протокола идет с версии 2.0 либы (август 2000). В PHP по умолчанию работает версия 2, поэтому для работы по версии 3 (если расширение поддерживает его) можно попробовать принудительно включить опцию:
 
Код:
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)

В PHP5 php_ldap.dll имеет версию явно больше, чем 2.0, за более старые версии пыха не поручусь.
2
20 сентября 2007 года
squirL
5.6K / / 13.08.2003
по сабжу
http://adldap.sourceforge.net/
http://www.developer.com/lang/php/article.php/3100951
не спасет?
30K
24 сентября 2007 года
Dagas
11 / / 10.09.2007
Цитата: alekciy
В OpenLDAP поддежка V3 протокола идет с версии 2.0 либы (август 2000). В PHP по умолчанию работает версия 2, поэтому для работы по версии 3 (если расширение поддерживает его) можно попробовать принудительно включить опцию:
 
Код:
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)



Эту опцию принудительно можно включить только если пройдет соединение типа

 
Код:
$dc=ldap_connect($ldap_server,$ldap_port);


А оно не происходит, потому что по умолчанию стоит протокол v2. в PHP5.

Пробовал сделать

 
Код:
ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, 3);


номер не прошел, хотя в примерах на php.com видел такую конструкцию.

Просто во всех примерах, которые я видел, рекомендуется включить протокол v3. но везде приведен именно такой порядок - подключить, установить протокол, пробиндиться.

P.S. Вроде сделал. Нашел такую конструкцию:

 
Код:
$dc=ldap_connect("ldap://ldap.server.com");


Подставил свой сервер и биндинг прошел.
Хотя опять же, есть комменты к такому вызову и написано, что такая форма обращения не всегда может сработать.
30K
27 сентября 2007 года
Dagas
11 / / 10.09.2007
Застрял в другом месте.
Сделал

 
Код:
if(!isset($_SERVER[PHP_AUTH_USER]))
 {
  header("WWW ...");
  header("HTTP/1.0 401 ...");
  exit;
 }


получил логин и пароль. Под тестовым пользователем, в DN которого нет кириллицы зашел в AD, сделал поиск, нашел пользователя для которого выполняется условие

 
Код:
if(strcasecmp($_SERVER['PHP_AUTH_USER'],$info[$i]["samaccountname"][0]==0))


и получил его DN. Теперь по логике, я должен проверить, что бы у этого пользователя пароль
 
Код:
$_SERVER['PHP_AUTH_PW']
совпадал с паролем в AD.

Пока в голову ничего лучше чем разбиндиться из-под старого тестового пользователя и забиндиться под новым не пришло. Т.е. делаю:

 
Код:
$login_user=$info[$i]["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?
30K
28 сентября 2007 года
Dagas
11 / / 10.09.2007
Уже работает.
Фишка, как я понял в чем - AD ни в какую от FreeBSD не хотел принимать записи содержищие строку OU=Сотрудники, как я не бился с перекодированием ее. Попытка биндинга с полным именем типа CN=test,OU=Сотрудники,DC=... убивалась на корню. Но! Толи это фича такая, я не понял. Вобщем сделал первый вход не по полному имени, а ввел имя в формате test@..., зашло, выполнило поиск, нашло samaccountname, и потом я этот же $info[$i]["samaccountname"][0]."@..." пихнул как имя пользователя для биндинга. Прохавало! Я в шоке от силы внутренней логики ldap+AD. По принципу, раз ты меня по имени-отчеству спрашивал в первый раз, то и второй раз будь любезен, а вообще я и по имени могу, и нефиг тут французский церемониал разводить.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог