Bonjour,
Après une absence de plusieurs années (mais personne ne doit s'en souvenir ^^'), je suis de retour sur les listes de diffusion de SPIP 
J'aimerais utiliser les fonctionnalités de liaison de SPIP avec un annuaire LDAP. Et dans mon cas, cet annuaire c'est AD...
En fouillant un peu sur le site, j'ai vu que d'autres personnes avaient essayé, et s'étaient heurtées à des problèmes, notamment des problèmes de création de doublons d'utilisateurs, le champ 'login' n'étant pas renseigné.
J'ai essayé de regarder d'où cela venait, et j'ai trouvé le problème qui se pose sur mon environnement (avec SPIP 2.0.6) : la ligne 84 du fichier ecrire\auth\ldap.php ne génère pas d'erreur même si le champ 'uid' n'existe pas dans l'AD
******************** ligne 84 ********************
// Lire les infos sur l'uid de l'utilisateur depuis LDAP
$result = @ldap_read($ldap_link, $dn, "objectClass=*", array("uid", "cn", "mail", "description"));
**************************************************
Du coup, on ne passe pas dans la partie qui récupère le samaccountname (et le login reste donc vide).
Pour résoudre ce problème, j'ai modifié cette ligne 84 en ajoutant la récupération du samaccountname s'il existe :
******************** ligne 84 ********************
// Lire les infos sur l'uid de l'utilisateur depuis LDAP
$result = @ldap_read($ldap_link, $dn, "objectClass=*", array("uid", "samaccountname", "cn", "mail", "description"));
**************************************************
Et dans l'initialisation de la variable $login ligne 102, j'ai ajouté un test pour utiliser le samaccountname, en remplaçant :
**************************************************
if (!$login) $login = $val[$uid][0];
**************************************************
par :
**************************************************
if (!$login) $login = $val['uid'][0];
// Si ça ne marche pas, essayer avec le samaccountname
if (!$login) $login = $val['samaccountname'][0];
**************************************************
Je suppose cependant que si le code était conçu comme ça, c'est que dans certains contextes la fonction ldap_read renvoie une erreur si un des attributs demandés n'existe pas. Je propose donc au final le code suivant (en plus de la modification de récupération des données de l'auteur ci-dessus), qui devrait résoudre le problème sans entrainer de régression :
**************************************************
// Lire les infos sur l'utilisateur depuis LDAP
$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array('uid', 'samaccountname', 'cn', 'mail', 'description'));
// Si ça ne marche pas, essayer avec l'uid uniquement
if (!$result) {
$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array('uid', 'cn', 'mail', 'description'));
}
// Si ça ne marche pas, essayer avec le samaccountname uniquement
if (!$result) {
$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array('samaccountname', 'cn', 'mail', 'description'));
}
**************************************************
Qu'en pensez-vous ?
Sylvain
ce qui serait vraiment intéressant ce serait de modifier la mise en oeuvre du LDAP qui soit vraiment un choix du webmestre et non pas la recherche aléatoire d'un champ de login via un script.
quitte a proposer des valeurs par défaut comme le fait glpi
j'avais proposé une modification en ce sens il y a quelque temps.
si on veut s'orienter vers un allégement de spip et une sortie de cette fonctionnalité du core ( tendance spip 2.1) la mise en plugin s'impose.