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é)