Главная > PHP > Авторизация доменных пользователей на PHP

Авторизация доменных пользователей на PHP

Иногда, для корпоративных порталов, актуально не заводить отдельный список пользователей, а производить авторизацию через контроллер доменов. Для этого в PHP есть набор специальных функций Облегчённый протокол доступа к каталогам (LDAP). В принципе там все написано, но рассмотрим простой пример. Надеюсь это будет полезно для тех, кто не особо знаком с особенностями работы контроллера домена. Здесь не будем рассматривать то, как передавать информацию серверу, просто предположим, что в POST запросе прилетают имя пользователя (username) и пароль (password) Итак, код с комментариями: 1. Набор опций (конфиг, так сказать) Если с хостом и портом в принципе все понятно, то я бы пояснил эти две непонятные строчки. Русские названия специально приведены т.к. в DC (domain controller) так вполне можно называть объекты. (в связи с этим на забываем про функцию iconv. Может пригодится. На этом этапе структуру DC можно рассматривать как набор папок с файлами в файловой системе. Папки вложены, и так формируется пути, которые мы видим. максимальная вложенность - слева. Теперь, как он строится: cn - это объект (файл). Пользователь, группа. ou - это папка, конечно все можно сложить с одну папку, но в большом хаосе обычно сложно ориентироваться. dc - имя домена. т.к. на одном сервере может быть несколько доменов. Корневая папка. т.е в этом примере мы будем авторизовывать пользователей, которые лежат в папке (и подпапках) "midomain.ru -> Пользователи" и принадлежат к группе "Портал", лежащей в папке "mydomain.ru -> Группы" Ну и последнее - sAMAccountName - имя пользователя до собачки (user@mydomain.ru) 2. И собственно набор функций и условий: Тут все просто, почти до безобразия. ldap_connect - подключаемся к серверу ldap_bind - авторизуемся на сервере (в принципе возможно уже и этого достаточно, но... ) ldap_search - ищем этого пользователя по условию, что он является членом группы. И пару слов про сквозную авторизацию - этот вариант не рассматриваю, т.к. передавать пароль серверу умеет только ИЕ (вроде как) и только при определенных настройках. Безопасность все-таки. Так же хорошо бы пароль шифровать, если он летает по инету.
1 звезда2 звезды3 звезды4 звезды5 звезд (1 votes, average: 5,00 out of 5)
Загрузка...
  1. Андрей
    31 января 2013 в 07:46 | #1

    Добрый день! Не могли бы Вы все таки написать как в данном случаи использовать сквозную авторизацию? Очень надо…

  2. chum
    3 февраля 2013 в 09:37 | #2

    @Андрей
    Андрей, сквозную авторизацию можно сделать только в том случае, если пользователь будет работать через IE другие браузеры это не поддерживают. Лично я такого не делал (было не нужно), но возможно напишу статью об этом, а вообще Вам нужно капать в сторону Apache+ Kerberos + LDAP. Если сделаете это быстрее нас, пришлите решение. Удачи

  3. 4 января 2014 в 13:40 | #3

    Подскажите, каким образом можно в случае успешной авторизации выводить ФИО, телефон, email и т.д. с AD

    • chum
      21 января 2014 в 19:38 | #4

      Приветствую.

      Примерно это должно выглядеть как то так. Это надо вставить в IF где удалась авторизация. Это кусок кода из моего скрипта где я вытаскивал все дни рождения, может половина не нужна. Сама нужная часть это:
      $result_ent = ldap_get_entries($ldap,$result);
      и
      $result_ent[$j][‘cn’][0] — тут как раз индексы массива (cn, mail) в которых хранится инфа о пользователе.

      // Получаем инфу
      $result_ent = ldap_get_entries($ldap,$result);
      //собираем массив
      $mass = array();
      for ($j=0;$j<$result_ent['count'];$j++) { if (!empty($result_ent[$j]['description'][0])) { $k++; $mass[$k]['name'] = $result_ent[$j]['cn'][0]; $mass[$k]['mail'] = $result_ent[$j]['mail'][0]; } }

  4. Андрей
    30 июня 2014 в 12:15 | #5

    Добрый день!
    Можете написать часть кода где это должно быть? Чего то не понял в какую часть кода это нужно вставить…

  5. Андрей
    2 июля 2014 в 07:59 | #6

    И как сделать кнопку выхода?

  6. Дмитрий
    26 июля 2018 в 02:24 | #7

    @Андрей
    по идеи.
    при инициализации страницы открываешь сессию session start();
    при удаче авторизации пишешь какубнибудь переменную в массив сессии $_Session[‘xxxxxx’]
    а на кнопку выход привязываешь почистить сессию:
    например в request формой передаешь logout

    $_Request[‘logout’]
    а потом проверяешь в начале страницы есть ли метка и если есть то закрытие сессии
    if(isset($_Request[‘logout’])) session_unset();

  1. Пока что нет уведомлений.


два + = 6

Heads up! You are attempting to upload an invalid image. If saved, this image will not display with your comment.