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é:
     −
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.
+
= 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.
   −
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'''.  
+
= 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:
   −
Même si j'ai supprimé une grande partie du code du login ici, cet objet n'est pas déclaré dans ce script.
+
{{Template:CodeSampleForLoginProcess}}
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 #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).
   −
    session_name("DOLSESSID_".$dolibarr_main_db_name);
+
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.
    session_start();
     −
    // Si on rentre ici suite a soumission d'un couple user/password alors
+
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"]))".
   −
        // Selon la valeur dolibarr_main_authentication, on appelle la fonction
+
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.
        // dans le bon fichier qui verifie si un couple user/mot de passe est correcte
     −
    // Sinon, on affiche la page de login
+
= Les mode d'authentification et modules de login =
   −
== Les 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'''.
   −
Les modules de login sont les fichiers qui contiennent les fonctions qui controlent la validite d'un couple user/password.
+
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'''.
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'''.
+
Voir [[Authentication,_SSO_and_SSL]] pour une liste des modes d'authentification (valeurs possibles pour 'xxx' et leur spécificité)
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.