Authentification
Introduction
Le système d'authentification de Dolibarr devient relativement complexe, et un bug peut être particulièrement difficile à trouver si l'on ne connaît par le processus d'authentification. Cette page présente une découpe du processus, qui permet de suivre la procédure et d'intervenir là où il le faut.
Processus
Le processus démarre par l'appel de la page que l'on souhaite voir. Par exemple, la page d'accueil htdocs/index.php. Mais ce n'est pas ce fichier assure la demande d'authentification. En fait toute page de Dolibarr inclut un fichier pre.inc.php qui lui même inclut le fichier main.php qui inclut master.php. Nous avons donc:
<index.php> <pre.inc.php> <main.inc.php> <master.inc.php> #1# </master.inc.php> #2# </main.inc.php> </pre.inc.php> </index.php>
Le #1# représente le chargement de tout un tas de librairie que nous utiliserons par la suite, ainsi que l'initialisation du contexte d'exécution du code PHP (langue, configuration, utilisateur vierge).
Le #2# représente l'exécution de code propre à l'authentification: La verification que l'on ait dans une session loguée et si ce n'est pas le cas l'affichage de l'écran de login. C'est la que l'objet utilisateur est initialisé:
L'exécution du login, elle, se présente comme suit:
$authmode=array('http','dolibarr'); if (isset($dolibarr_auto_user)) $authmode=array('auto'); // Si la demande du login a déjà eu lieu, on le récupère depuis la session // sinon appel du module qui réalise sa demande. // A l'issu de cette phase, la variable $login sera définie. $login=; if (! session_id() || ! isset($_SESSION["dol_user"])) { # Procédure de login. Affiche page login # } else { // On est déjà en session $login=$_SESSION["dol_user"]; } // Charge l'objet user depuis son login $result=$user->fetch($login); if ($result <= 0) { dolibarr_print_error($db,$langs->trans("ErrorCantLoadUserFromDolibarrDatabase")); exit; } // Est-ce une nouvelle session if (! isset($_SESSION["dol_user"])) { // Nouvelle session pour ce login dolibarr_syslog("New session in DOLSESSID_".$dolibarr_main_db_name.": ".session_id()); $user->update_last_login_date(); $_SESSION["dol_user"]=$user; }
Encore une fois, le code de plus grande complexité a été extrait pour l'analyser plus en détail.
Toutefois, en passant au travers du code ci-dessus de façon rapide, quelque chose pourrait vous avoir sauté aux yeux. C'est l'objet $user.
Même si j'ai supprimé une grande partie du code du login ici, cet objet n'est pas déclaré dans ce script. En fait, il fait l'objet d'une instanciation au sein d'une méthode sur l'objet DOLIAuth, que nous verrons ci-dessous, et dont la classe est (re)définie dans htdocs/includes/pear/Auth/Auth.php. C'est lorsque l'on appelle la méthode start() sur cet objet que l'objet $user est instancié.
Mais analysons plus en détail le code d'appel de la méthode d'authentification (il y a plusieurs méthodes, donc plusieurs appels possibles et qui devraient être mutuellement exclusifs).
session_name("DOLSESSID_".$dolibarr_main_db_name); session_start();
// Si on rentre ici suite a soumission d'un couple user/password alors
// Selon la valeur dolibarr_main_authentication, on appelle la fonction // dans le bon fichier qui verifie si un couple user/mot de passe est correcte
// Sinon, on affiche la page de login
Les modules de login
Les modules de login sont les fichiers qui contiennent les fonctions qui controlent la validite d'un couple user/password. Il y a un fichier par module. Chaque fichier assure un type de controle différent.
- Le fichier htdocs/include/login/functions_http.php controle la validite du couple user/mot de passe par une authentification de type http Basic.
- Le fichier htdocs/include/login/functions_ldap.php verifie la validite d'un couple user/mot de passe dans un annuaire LDAP.
- Le fichier htdocs/include/login/functions_dolibarr.php veririe la validite d'un couple user/mot de passe dans la base de donnee Dolibarr.
Chaque fichier contient en fait uniquement une fonction check_user_password_xxx mais Dolibarr ne va en utiliser qu'un. Ce sera celui dont la valeur xxx correspond a la valeur de la variable dolibarr_main_authentication. Dans ce fichier, Dolibarr sollicite la seule fonction qui s'y trouve en envoyant comme parametres le user et mot de passe.La fonction renvoie vrai si le couple est valide.