web-dev-qa-db-fra.com

Authentification de l'utilisateur à l'aide de LDAP à partir de PHP

Mon projet est de créer un système d'inscription de modules pour notre université. J'ai donc contacté les informaticiens de mon université pour plus de détails afin d'authentifier les étudiants dans le système. Nous développons le système en utilisant la connexion universitaire existante. Ils m'ont donné des informations LDAP, je n'en connais pas l'usage. J'utilise PHP, Mysql sur un serveur Apacha. Comment puis-je authentifier un utilisateur qui se connecte à mon système, compte tenu de son ID utilisateur et de son mot de passe avec les informations LDAP.

Ci-dessous, les informations LDAP (j'ai changé le nom de domaine, etc.)

Informations LDAP pour le domaine 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 
35
John

La procédure générale serait (les commandes php ext/ldap pertinentes entre parenthèses):

  1. se connecter au serveur LDAP en utilisant "l'hôte LDAP" et le "numéro de port LDAP" ( ldap_connect () ) et définir les options de connexion correctes ( ldap_set_option () ), en particulier LDAP_OPT_PROTOCOL_VERSION et LDAP_OPT_REFERRALS

  2. se lier au serveur LDAP en utilisant le "compte LDAP à lier" et le "mot de passe du compte LDAP" ( ldap_bind () ) - si vous vous authentifiez auprès d'un serveur Active Directory, vous pouvez utiliser directement le nom d'utilisateur et le mot de passe à partir de la page de connexion et ignorez toutes les étapes suivantes.

  3. recherchez dans l'arborescence une entrée/un objet utilisateur correspondant en spécifiant le "DN DE BASE" et le filtre LDAP approprié - probablement quelque chose comme (&(objectClass=user)(sAMAccountName=%s))%s doit être remplacé par le nom d'utilisateur à authentifier ( ldap_search () )

  4. vérifier si le nombre d'entrées retournées est 1 (si <> 1 alors quelque chose a mal tourné, par exemple aucun utilisateur trouvé ou plusieurs utilisateurs trouvés)

  5. retrive le nom unique (DN) de cette entrée unique ( ldap_get_dn () )

  6. utilisez le DN trouvé à la dernière étape pour essayer de vous lier au serveur LDAP avec le mot de passe donné sur la page d'authentification ( ldap_bind () )

  7. si la liaison réussit alors tout est OK, sinon, le mot de passe est probablement incorrect

Ce n'est vraiment pas aussi difficile qu'il y paraît au premier abord. En général, je propose d'utiliser une sorte de bibliothèque standard pour l'authentification par rapport à un serveur LDAP tel que Net_LDAP2 PEAR package ou Zend_Ldap hors du Zend Framework . Je n'ai aucune expérience de l'utilisation de Net_LDAP2 (même si je connais assez bien le code) mais Zend_Ldap fonctionne très bien contre les serveurs Active Directory ou les serveurs ADAMS (qui est évidemment ce avec quoi vous travaillez).

Cela fera l'affaire en utilisant 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);
52
Stefan Gehrig

Vous pouvez essayer http://code.activestate.com/recipes/101525/ tout en vous référant à http://us3.php.net/ldap et à d'autres résultats d'un Recherche Google pour [authentification php ldap] .

4
Emil Sit

@Stephen a fourni de bons points. Voici mon code simple PHP pour authentifier en utilisant AD:

  1. vous devez d'abord connaître ces paramètres: hôte du serveur, domaine utilisateur (vous devez également dn de base si vous voulez interroger AD).
  2. utilisez le code suivant:

    $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
PHPst

vous pouvez utiliser http://pear.php.net/package/Net_LDAP2/docs c'est sympa et ça marche.

Exemple de connexion pris par le doc:

// 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());
}
2
damko