Аутентификация пользователя с использованием LDAP из PHP - PullRequest
35 голосов
/ 13 февраля 2009

Мой проект состоит в том, чтобы сделать систему приема модулей для нашего университета. Поэтому я связался с ИТ-специалистами в моем университете, чтобы узнать подробности аутентификации студентов в системе. Мы развиваем систему, используя существующий университетский логин. Они дали мне некоторую информацию LDAP, я не знаю, как это использовать. Я использую PHP, Mysql на сервере Apacha. Как я могу аутентифицировать пользователя, входящего в мою систему, учитывая его ИД пользователя и пароль с информацией LDAP.

Ниже приведена информация о LDAP (я изменил имя домена и т. Д.)

Информация LDAP для домена blueroom.ac.uk


LDAP Host : ad.blueroom.ac.uk

LDAP port no: 389

BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my

LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk

LDAP account password : ********

Attribute : sAMAccountName 

Ответы [ 4 ]

52 голосов
/ 13 февраля 2009

Общая процедура будет (соответствующие команды ext / ldap php в скобках):

  1. подключиться к серверу LDAP с помощью «LDAP Host» и «LDAP port no» ( ldap_connect () ) и установить правильные параметры подключения ( ldap_set_option () ) особенно LDAP_OPT_PROTOCOL_VERSION и LDAP_OPT_REFERRALS

  2. привязка к серверу LDAP с использованием «привязки учетной записи LDAP» и «пароля учетной записи LDAP» ( ldap_bind () ) - если вы проходите аутентификацию на сервере Active Directory, вы можете напрямую использовать имя пользователя и пароль со страницы входа в систему и пропустите все следующие шаги.

  3. поиск в дереве соответствующей пользовательской записи / объекта, указав «BASE DN» и соответствующий фильтр LDAP - скорее всего, что-то вроде (&(objectClass=user)(sAMAccountName=%s)), где %s должно быть заменено именем пользователя для аутентификации ( ldap_search () )

  4. проверить, равно ли количество возвращенных записей 1 (если <> 1, значит, что-то пошло не так, например, не найден пользователь или найдено несколько пользователей)

  5. получить отличительное имя (DN) этой отдельной записи ( ldap_get_dn () )

  6. используйте DN, найденное на последнем шаге, чтобы попытаться привязать к серверу LDAP пароль, указанный на странице аутентификации ( ldap_bind () )

  7. если связывание прошло успешно, тогда все в порядке, если нет, скорее всего, пароль неверный

Это действительно не так сложно, как кажется на первый взгляд. Как правило, я бы предложил использовать некоторую стандартную библиотеку для аутентификации на сервере LDAP, например, пакет Net_LDAP2 PEAR или Zend_Ldap из Zend Framework . У меня нет опыта использования Net_LDAP2 (хотя я достаточно хорошо знаю код), но Zend_Ldap очень хорошо работает с серверами Active Directory или серверами ADAMS (что, очевидно, то, с чем вы работаете).

Это поможет, используя Zend_Ldap:

$options = array(
    'host'                 => 'ad.blueroom.ac.uk',
    'useStartTls'          => true,
    'accountDomainName'    => 'blueroom.ac.uk',
    'accountCanonicalForm' => 4,
    'baseDn'               => 'ou=bluebird,dc=bluebird,dc=ac,dc=my',
);
$ldap = new Zend_Ldap($options);
try {
    $ldap->bind('user', 'password');
} catch (Zend_Ldap_Exception $e) {
    // something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);
4 голосов
/ 13 февраля 2009

Вы можете попробовать http://code.activestate.com/recipes/101525/, ссылаясь на http://us3.php.net/ldap и другие результаты поиска Google для [php ldap authentication] .

2 голосов
/ 04 июня 2015

@ Стивен дал хорошие очки. Вот мой простой PHP-код для аутентификации с использованием AD:

  1. сначала вам нужно знать следующие параметры: хост сервера, домен пользователя (вам также нужно указать базовый dn, если вы хотите запросить AD).
  2. используйте следующий код:

    $ldap = ldap_connect($host); // e.g. 165.5.54.6 or an URL
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
    $bind = ldap_bind($ldap, $username.'@'.$userDomain, $passwrod);
    
    if($bind){
    // successful authentication. 
    }
    
2 голосов
/ 23 июля 2009

вы можете использовать http://pear.php.net/package/Net_LDAP2/docs это хорошо и работает.

Пример подключения, принятого в документе:

// Inclusion of the Net_LDAP2 package:
require_once 'Net/LDAP.php';

// The configuration array:
$config = array (
    'binddn'    => 'cn=admin,ou=users,dc=example,dc=org',
    'bindpw'    => 'password',
    'basedn'    => 'dc=example,dc=org',
    'host'      => 'ldap.example.org'
);

// Connecting using the configuration:
$ldap = Net_LDAP2::connect($config);

// Testing for connection error
if (PEAR::isError($ldap)) {
    die('Could not connect to LDAP-server: '.$ldap->getMessage());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...