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 pas 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. Une connaissance de la notion de session PHP est requise.

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 qui assure la demande d'authentification. En fait toute page de Dolibarr inclut un fichier main.inc.php qui lui même inclut le fichier master.inc.php. Nous avons donc:

 <mypage.php>
     <main.inc.php>
       <master.inc.php>
         #1#
       </master.inc.php>
       #2#
       if (!isset($_SESSION["dol_login"]))
       {
         // Set goontestloop to true if we are coming from a post of the login page ($_POST["username"] and $_POST["actionlogin"] is defined.
         // We may also set goontestloop to true for some other cases depending on the authentication mode (see next chapter)
         $goontestloop = ...  
         if ($goontestloop)
         {
           checkLoginPassEntity(username, password, ...);
           ...
           // if user and pass are ok, we set $login
           $login=
         }
         if (! $login)
         { 
	       // We show login page
	       include_once(DOL_DOCUMENT_ROOT."/lib/security.lib.php");
	       dol_loginfunction($langs,$conf,$mysoc);
	       exit;
         }
         ...
       }
     </main.inc.php>
   #3#
 </mypage.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 le code d'authentification: Le programme vérifie si on est dans une session loguée (cela signifie que $_SESSION["dol_login"] existe). Si non, on vérifie si on a reçu des données issu du formulaire de login/mote passe. Au premier appel, ce n'est pas le cas puisque nous n'avons pas encore eu le formulaire à l'écran. Aussi on rentre dans le if, et $login étant faux, on affiche alors le formulaire HTML de login et le script se termine.

Après la soumission du login, la même page (donc index.php) est appelée, nous allons toujours dans le #1#, puis #2# et cette fois $_POST["username"] est défini. Aussi nous vérifions si le user et mot de passe sont ok (la vérifivation est faite dans la base, en LDAP ou autre, cela dépend de la variable $dolibarr_main_authentication du fichier de configuration). Si le couple login/pass est ok, la variable $login est définie, aussi nous n'affichons pas à nouveau le formulaire mais nous continuons et positionnons $_SESSION["dol_login"], ainsi au prochain appel d'une page, nous ne rentrons plus dans le "if (! isset($_SESSION["dol_login"]))".

Le #3# correspond à la vérification des permissions métiers et à l'affichage de la page si c'est ok. Voir la page See Permissions pour plus d'informations.

Les mode d'authentification et modules de login

L'appel de checkLoginPassEntity pour valider le couple utilisateur/mot de passe (ou uniquement l'utilisateur dans certains cas) appellera la fonction check_user_password_xxx d'un module de connexion. Le module de connexion appelé dépend du mode d'authentification défini dans votre fichier conf/conf.php.

Le fichier utilisé est nommé htdocs/core/login/functions_xxx.php avec la valeur xxx qui correspond à la valeur définie dans dolibarr_main_authentication dans le fichier de configuration conf/ conf.php.

Voir Authentication,_SSO_and_SSL pour une liste des modes d'authentification (valeurs possibles pour 'xxx' et leur spécificité)