2009-02-13 5 views
35

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

Ниже приводится информация о 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 
+0

Если ваш сервер находится поле Linux, вы не сможете поговорить с AD без соответствующего сертификата сервера. Это может быть проблемой, если вам нужна помощь из Университета. – 2010-08-18 08:29:20

ответ

52

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

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

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

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

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

  5. retrive различающееся имя (DN) этого единственного элемента (ldap_get_dn())

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

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

Это действительно не так сложно, как кажется. Как правило, я предлагаю использовать какую-то стандартную библиотеку для аутентификации на сервере LDAP, например, для пакета PEAR Net_LDAP2 или 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); 
+0

Только что последовал за некоторыми вашими шагами и заставил это работать как шарм ... прошел собственный путь модуля PHP LDAP. –

+0

Просто предостережение тем, кто использует этот метод: если ваш сервер ldap разрешает анонимный вход в систему, убедитесь, что вы отфильтровываете пустые пароли как недопустимые до попытки аутентификации. – Tyzoid

+0

Я проверяю подлинность на сервере Active Directory, но мне все равно нужно пройти все шаги до 7. – Jibbyj

2

вы могли бы использовать 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()); 
} 
1

@Stephen условии хороших точек. Вот мой простой 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. 
    } 
    
Смежные вопросы