Changes

m
Line 1: Line 1: −
== Introduction ==
+
<!-- BEGIN interlang links -->
 +
<!-- Do NOT edit this section
 +
    Links below are automatically managed by PolyglotBot
 +
    You can edit links on the English source page : Authentication -->
 +
[[en:Authentication]]
 +
[[es:Autentificación]]
 +
[[zh:认证]]
 +
<!-- END interlang links -->
 +
 
 +
[[Category:Noyau]]
 +
{{TemplateDocDev}}
 +
 
 +
 
 +
 
 +
 
   −
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:
  −
<pre>
  −
<index.php>
  −
  <pre.inc.php>
  −
    <main.inc.php>
  −
      <master.inc.php>
  −
        #1#
  −
      </master.inc.php>
  −
      #2#
  −
    </main.inc.php>
  −
  </pre.inc.php>
  −
</index.php>
  −
</pre>
     −
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é:
+
= 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.
   −
L'exécution du login, elle, se présente comme suit:
+
= 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:
   −
$authmode=array('http','dolibarr');
+
{{Template:CodeSampleForLoginProcess}}
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.
+
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).
   −
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'''.  
+
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.
   −
Même si j'ai supprimé une grande partie du code du login ici, cet objet n'est pas déclaré dans ce script.
+
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"]))".
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).
+
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.
   −
    session_name("DOLSESSID_".$dolibarr_main_db_name);
+
= Les mode d'authentification et modules de login =
    session_start();
     −
    // Si on rentre ici suite a soumission d'un couple user/password alors
+
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'''.
   −
        // Selon la valeur dolibarr_main_authentication, on appelle la fonction
+
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'''.
        // dans le bon fichier qui verifie si un couple user/mot de passe est correcte
     −
    // Sinon, on affiche la page de login
+
Voir [[Authentication,_SSO_and_SSL]] pour une liste des modes d'authentification (valeurs possibles pour 'xxx' et leur spécificité)