Fonctionnement synchronisation LDAP -> Dolibarr?

Bonjour,

J’ai eu beaucoup de mal à comprendre et mettre en place la connexion ldap -> Dolibarr sur ma version 11.0.3, et bien que cela semble maintenant fonctionner, le comportement me laisse perplexe, au point de penser que je n’ai pas encore bien compris et ai fait des erreurs.

Pourquoi faut-il doubler la configuration dans la configuration du module (logique) mais aussi dans un fichier php ? En toute logique (enfin selon la mienne) on ne devrait avoir qu’à renseigner la configuration du module pour que cela fonctionne et ne saisir qu’un jeu d’information… C’est vraiment une source de confusion quand on fait ça pour la 1ère fois ! Est-ce une limitation technique ou bien que le module ldap n’est pas encore suffisamment intégré à l’ERP pour que tout fonctionne depuis la configuration du module ?

Pourquoi faut-il manuellement créer un utilisateur depuis la gestion des utilisateurs pour les compte ldap ? A l’époque ou j’avais testé OpenERP et son module ldap, la seule configuration du module suffisait sans besoin d’éditer des fichiers, et surtout, la 1ère connexion d’un utilisateur ldap permettait de créer le compte utilisateur dans l’ERP à partir des données ldap (et d’un template utilisateur pour les données absentes mais nécessaires). De même un utilisateur ldap n’avait pas de mot de passe dans l’ERP qui pourrait lui laisser un accès avec un second mot de passe différend du mot de passe unique du ldap. Le principe du serveur ldap est de centraliser la gestion des comptes sans avoir à gérer manuellement les utilisateurs dans les autres logiciels.

Je n’ai pas compris comment lier les groupes ldap et les groupes Dolibarr pour la gestion des droits d’accès, j’ai du aussi ajouter manuellement les utilisateurs ldap dans les groupes.

Alors est-ce moi qui ai mal compris ou bien est-ce bien le fonctionnement actuel du module ldap, et a-t-il vocation à évoluer vers une configuration unique (en base de donnée de préférence) et avec création automatique des utilisateurs, ou bien est-ce un choix délibéré pour des raisons dont je n’ai pas connaissance ?

Alors, pour répondre rapidement, moi qui suis aussi dans le même cas que toi…
Je n’ai pas compris aussi pourquoi configurer le conf.php et le module LDAP.
Surtout que les informations sont les mêmes.
Quoi qu’il en soit, cette partie « Authentification » fonctionne bien, donc bon, c’est plutôt top.

Ce que je ne comprends pas c’est pourquoi la syncro des utilisateurs et groupes ne fonctionne pas.

C’est comme si le paramètre :

Synchronisation des utilisateurs et groupes

dans le module LDAP de Dolibarr n’était pas pris en compte.

Le pire c’est qu’il y a un script nommé sync_users_ldap2dolibarr.php dans /scripts/users
Mais sert-il à quelque chose ? Il n’est pas là pour rien.
Faut-il le lancer manuellement avec une tache CRON ?

Idem pour les membres des groupes qui ne se rajoutent pas automatiquement.
Mais je pense que c’est lié au premier problème.

Je vais essayer de lancer manuellement le script, voir si cela réagit.

Bon, on voit qu’en exécutant le script sync_users_ldap2dolibarr.php manuellement on à une sortie…
J’ai remplacé toutes les informations confidentielles par des *******

$ /usr/local/bin/php /********/scripts/user/sync_users_ldap2dolibarr.php commitiferror
***** sync_users_ldap2dolibarr.php (11.0.0) pid=3558406 *****
Mails sending disabled (useless in batch mode)

----- Synchronize all records from LDAP database:
host=********
port=*********
login=*********,OU=Utilisateurs,OU=Organisation,DC=proserv,DC=local
pass=********
DN to extract=OU=Utilisateurs,OU=Organisation,DC=proserv,DC=local
Filter=(&(objectClass=person))
----- To Dolibarr database:
type=mysqli
host=localhost
port=3306
login=********
database=********
----- Options:
commitiferror=1
excludeuser=
Mapped LDAP fields=sAMAccountName,displayName,sn,givenname,cn,userPassword,telephonenumber,facsimiletelephonenumber,mobile,mail,title,description,objectSid

Hit Enter to continue or CTRL+C to stop...

Pas d'erreur, on valide

[[email protected] ~]$

Mais toujours rien dans Dolibarr que ce soit pour les utilisateurs ou les groupes.
Sur le wiki du module LDAP il est dit qu’il y aurai des logs dans le dossier /documents/ldap/temp si des erreurs seraient provoquées > mais rien de ce coté non plus.

Le script n’est visiblement plus maintenu depuis 2012…

Bon en fait si… Il faut bien renseigner la Clé dans le module LDAP (petite selection tout à droite, colonne Clé dans LDAP)

Pour un AD Microsoft, il faut que la clé soit sur l’attribue cn
Cet attribue doit être renseigné sur le premier champ nommé Prénom Nom

Il faut aussi impérativement renseigner le champ Identifiant (unix).
Personnellement, j’ai mis le même attribue que le champ du dessous Identifiant (samba, activedirectory) qui pour moi est sAMAccountName

Dans le module LDAP, sur l’onglet Utilisateur, on peut tester si les utilisateurs sont bien reconnus par Dolibarr avec le bouton « TESTER UNE RECHERCHE LDAP »

Ensuite en lançant le script, les utilisateurs sont bien créé avec la commande suivante :
/chemin/ou/se/trouve/php -f /chemin/ou/se/trouve/dolibarr/scripts/user/sync_users_ldap2dolibarr.php commitiferror

l’argument commitiferror permet de continuer le script même si il se trouve une erreur.

Attention : Si dans le module Utilisateur et Groupe, le paramètre email est requis pour créer un utilisateur, il doit y avoir une adresse email valide dans la fiche utilisateur de l’AD (j’ai eu des erreurs parce que je ne mettait pas le TLD du domaine de l’email).
Il faut aussi que le champ email avec le bon attribue email soit renseigner dans la configuration du module LDAP.

Si l’utilisateur existe déjà avec le même identifiant, il ne sera pas créé de nouveau et les renseignement de l’utilisateur (poste, mail, adresse, ville, etc…) ne seront pas mis à jour.
D’ailleurs il n’existe visiblement pas de possibilité de mettre à jour un utilisateur depuis la synchronisation malgré la condition suivante dans le script :

if ($fuser->id > 0) { // User update
	print $langs->transnoentities("UserUpdate") . ' # ' . $key . ': login=' . $fuser->login . ', fullname=' . $fuser->getFullName($langs);
	$res = $fuser->update($user);

	if ($res < 0) {
		$error ++;
		print ' --> ' . $res . ' ' . $fuser->error;
	} else {
		print ' --> Updated user id=' . $fuser->id . ' login=' . $fuser->login;
	}
} else { // User creation

Aller, je regarde pour modifier le script afin de rendre la mise à jour opérationnel.

Aussi, pour la syncro des groupes c’est le script sync_groups_ldap2dolibarr.php dans le même dossier

Il fonctionne de la même façon.
Sauf que pour ma part les utilisateurs ne se sont pas intégré après la création des groupes par le scripts alors que le code s’y trouve :
// Gestion des utilisateurs associés au groupe
// 1 - Association des utilisateurs du groupe LDAP au groupe Dolibarr
foreach ($ldapgroup[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] as $key => $userdn) {

Je vais aussi voir ca.

Pour le fait de le faire fonctionner automatiquement, il faut rajouter l’argument -y à la fin de la commande pour ne pas qu’il y ait besoin d’une intervention manuel de l’utilisateur.
Une tache CRON et hop.

Du coup je ne comprends pas ce que le trigger nommé interface_50_modLdap_Ldapsynchro.class.php dans les infos de Dolibarr exécute.
–> Réponse : Visiblement ce script ne sert que dans le sens Dolibarr vers LDAP au vu de la description : Triggers of this module allows to synchronize Dolibarr toward a LDAP database.

@Uncle-Buzz, tu peux voir la modification à faire dans ce sujet : Mise à jour du Script Syncro LDAP

Depuis, la syncro des utilisateurs et groupes fonctionnement impec.

  • Création de l’utilisateurs si non présent
  • Mise à jour des utilisateurs si présent
  • Création des groupes si non présent
  • Mise à jour des groupes si présent
  • Rattachement des utilisateurs dans les groupes

ATTENTION : Dolibarr ne gère pas les groupes imbriqués, donc le groupe doit être visible dans l’attribue 'memberOf" de l’utilisateur.

Ca marche parfaitement pour un AD Microsoft.

Je partage ma config :

Partie Utilisateurs LDAP :


Partie Groupes LDAP :

Et le script modifié :

Merci pour le script, mais il s’agit d’une synchronisation « asynchrone », synchroniser une compte utilisateur au moment où il se connecte me semble bien plus souple et toujours à jour…

Connexion d’un utilisateur, recherche du couple login/mot de passe dans la base dolibarr, si compte inconnu ou mot de passe non reconnu, interrogation du ldap, si le serveur ldap répond favorablement, création de l’utilisateur dans la base de dolibarr si il est inconnu, recherche du groupe dans la base, si absence du groupe dans la base, création du groupe depuis le serveur ldap, rattachement de l’utilisateur au groupe et voilà… Si le groupe était inconnu il reste les droits d’accès à configurer, mais c’est obligatoire et la création de groupe est beaucoup plus rare que celle d’utilisateur.
Dans le cas ou l’utilisateur existe mais le mot de passe n’est pas reconnu par dolibarr, interrogation du serveur ldap, si le serveur répond favorablement, mise à jour du compte utilisateur, vérification du groupe, si le groupe existe, mise à jour du groupe… Et voilà
Ainsi tous le utilisateurs sont synchronisés un par un au moment de leur connexion et sont forcément à jour une fois connecté.
C’était le fonctionnement d’OpenERP et ça marchait très bien, une syncrhonisation de masse par script en plus pourquoi pas, mais je ne vois pas plus simple que le fonctionnement décrit.

Mouais… Pas sûr que le stockage du mot de passe dans la BDD soit sécure.
Pour moi, lors de connexion, il doit systématiquement interroger LDAP.

Il ne s’agit pas de copier le mot de passe ldap dans la base dolibarr, mais du mot de passe dolibarr d’un compte classique… Quand on passe le login et le mot de passe lors de la connexion, dolibarr ne connais pas à l’avance le type de compte.
A moins d’avoir retiré les comptes dolibarr dans la configuration pour ne garder que les comptes ldap, dolibarr va forcément contrôler le mot de passe local pour s’apercevoir que le login est incorrect, puis va demander au serveur ldap (ou inversement en fonction de la config si cela permet de gérer l’ordre) si il reconnait le couple login/mot de passe.
Sachant qu’idéalement, un compte ldap ne devrait pas pouvoir avoir un mot de passe dans dolibarr… Sauf que dolibarr exige un compte local éventuellement synchronisé avec un ldap, et exige un mot de passe qu’il génère aléatoirement, même pour un compte ldap…

Avec le script, le résultat est quasi identique (mais d’une différente méthode)… en fonction de interval de l’exécution du script.
Si, par exemple, tu lances le script toutes les 3 heures de 8h à 17h (soit 4 fois dans la journée), un nouvel utilisateur à plus de chance d’être déjà dans la base Dolibarr lors de sa première connexion.

Cependant je suis d’accord que le fonctionnement pourrai être amélioré. Comme plusieurs petites choses dans les solutions OpenSource.
Le principal, c’est que le résultat soit là non ?

Je ne suis développeur qu’à mes heures perdues.
J’ai simplement essayé de trouver une méthode, sans attendre une prochaine version majeur, pour solutionner un problème auquel j’étais aussi confronté depuis la v6.

PS : Avec le script, contrairement à la création manuel de l’utilisateur, Dolibarr sait que l’utilisateur est un utilisateur LDAP : (dans l’exemple, il est noté Externe, parce que je l’ai rattaché à un contact d’un Tier)

image

Là, lorsque j’ai créé manuellement l’utilisateur : (la mention « Utilisateur du domaine » n’est pas présente)

image

Je ne critique pas le script ! Mais trouver un module « officiel » avec double configuration et synchronisation incomplète, j’espère qu’il est toujours en développement pour aboutir à quelque chose de réellement fonctionnel.
A défaut, il faut tomber sur une bonne âme pour adapter un script ^^
Les utilisateurs je les ai importé à l’aide du bouton GET qui pioche dans la liste des utilisateurs ldap, avec cette méthode le compte créé est un compte pur dolibarr dont les données ont été récupérées sur le serveur ldap, ensuite seule l’authentification fait appel au serveur ldap puisque le mot de passe du compte utilisateur n’est pas connu par celui-ci car créé inutilement.

Malheureusement le module n’est plus en dev. Il est présent depuis plusieurs version en mode stable.
Il faudrait effectivement faire une demande d’évolution.

Même pas sûr que même la correction du script de syncro soit pris en compte sur les prochaines version.
J’avais fait un modèle de fiche produit en v9 (qui manquait cruellement de gueule), et l’ai déposé sur le dépôt officiel pour correction… Et en v11, toujours rien.

Depuis, je me note toutes les corrections que je fais sur les solutions OpenSource pour les refaire à chaque MAJ. :expressionless:

Je ne connais pas cette méthode… Tu as plus d’info (où elle est, ce qu’elle fait) ?
EDIT : Autant pour moi, je « vois » ce bouton lors de la création de l’utilisateur. Par contre, chez moi il est grisé. Cependant cela t’oblige à initier la création de chaque utilisateur (j’ai l’impression, à défaut de pouvoir le tester)

Tu as gardé les comptes dolibarr dans ta conf ou uniquement ldap ? Cela pourrait expliqué qu’il soit grisé…
Pour ma part sans script de synchronisation, c’est la seule façon de créer des comptes depuis le serveur ldap que j’avais trouvé…

J’ai bien gardé les deux :
// Authentication settings
$dolibarr_main_authentication=‹ ldap,dolibarr ›;

Et l’option Synchronization LDAP->Dolibarr dans le module LDAP (sinon le bouton GET n’apparaît pas)

Et pourtant :
image

Je suis en v11.0.0, peut être un problème sur cette version.

Autre chose qui n’est pas très clair :
L’intitulé de création d’un utilisateur indique qu’un utilisateur « interne » est un utilisateur interne à la société, et qu’un utilisateur « externe » est externe à la société (client, fournisseur…), mais le compte utilisateur créé par ton script de synchronisation ldap est décrit comme « externe (utilisateur du domaine) », alors que signifie en vrai interne/externe ? externe à la société ou externe à la base de donnée ?

L’utilisateur de test John Doe est marqué externe, parce que je l’ai rattaché à un contact d’un Tier (directement dans la fiche utilisateur de John Doe). Il s’est donc transformé en Utilisateur Externe. Sans quoi, il était bien noté en Utilisateur Interne avant le rattachement.

Je pense qu’il serait possible d’intégrer en partie le fonctionnement du script dans la partie authentification ldap pour exécuter la synchro sur l’utilisateur et le groupe rattaché. Mais bon comme c’est dans le core et qu’il n’a pas été prévu de hook pour effectuer autre chose depuis un module externe, la modificatio du code sera à reproduire à chaque MAJ…

J’ai jeté un oeil et la synchro ldap->dolibarr lors de l’authentification n’est prévu que pour un active directory, et ne concerne que le login (qui a mon sens est la seule chose qui ne soit jamais modifiée…)

Accessoirement, remplacer les variable du fichier conf.php par des appelles à $conf->global->LDAP_… devrait utiliser les données du modules comme pour ton script et éliminer la nécessité d’utiliser 2 jeu de données en double (à voir si ces variables ne sont pas utilisés ailleurs)

A vrai dire, ca c’est bien (voir obligatoire) quand tu as un annuaire qui bouge beaucoup.
Sinon, le mieux est de faire appel le moins possible à des ressources extérieurs. Surtout quand tu fais hébergé Dolibarr à l’extérieur et que ton AD est dans tes locaux :open_mouth: :sweat_smile:

$conf est un objet global… donc non utilisé ailleurs.

J’y ai pensé :wink: … mais cela n’apportera pas d’amélioration significative mise à part enlever des informations confidentielles comme l’authentification à ton AD pour sa lecture.

En fait je ne comprends pas l’intégration de ces données dans le fichier php… Pour la connexion au serveur ldap, quand on crée l’instance new ldap(), le constructeur utilise les valeurs par défaut qui sont… les valeurs renseignées dans la configuration du module en base de données… puis la fonction d’authentification ldap remplace ces valeurs par celle du fichier de configuration…

Le module LDAP n’est peut être pas pour l’authentification mais simplement pour la gestion des utilisateurs/groupes dans Dolibarr.
C’est sûrement pour cette raison que l’authentification ne fonctionne pas avec le module.
Cependant, on peut remplacer la valeur des variables par $conf->global->LDAP_ comme tu le mentionne.

Il faudrait peut être rajouter une option dans ce module (à cocher) pour activer l’authentification afin éviter le doublon.

L’authentification ldap est obligatoire, sauf erreur la synchronisation ldap ne permet pas de copier le mot de passe ldap vers la base dolibarr, du coup seul le serveur ldap peut identifier un compte ldap, la synchronisation des comptes/groupes ldap n’a pas de sens si on ne peut pas se connecter.
Je pense que c’est un développement en cours (même si arrêté) qui n’a pas été au bout. Ça fonctionne, donc c’est resté en l’état, mais ce n’est pas abouti.