Qual: Récriture de partie de code pour identification pour rendre processus plus clair et permettre externalisation plus tard de la fonction login.

This commit is contained in:
Laurent Destailleur 2006-07-02 00:43:40 +00:00
parent d865782c4c
commit 27715e025b
2 changed files with 173 additions and 157 deletions

View File

@ -55,61 +55,52 @@ if (get_magic_quotes_gpc())
require_once("master.inc.php"); require_once("master.inc.php");
/*
*/
$bc[0]="class=\"impair\""; $bc[0]="class=\"impair\"";
$bc[1]="class=\"pair\""; $bc[1]="class=\"pair\"";
// Verification du login.
// Cette verification est faite pour chaque accee Apres l'authentification,
// l'objet $user est initialise Notament $user->id, $user->login et $user->nom, $user->prenom
// \todo Stocker les infos de $user en session persistente php et ajouter recup dans le fetch
// depuis la sessions pour ne pas avoir a acceder a la base a chaque acces de page.
// MODE 1: Pas d'identification car force /*
if (! empty($dolibarr_auto_user)) * Phase identification
{ */
// Mode force sur un utilisateur (pour debug, demo, ...), on initialise la session
if (! session_id()) // $authmode contient la liste des différents modes d'identification à tester
// par ordre de préférence. Attention, rares sont les combinaisons possibles si
// plusieurs modes sont indiqués.
// Exemple: array('http','dolibarr');
// Exemple: array('ldap');
$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"]) && ! isset($_SESSION["dol_token"]))
{ {
session_name("DOLSESSID_".$dolibarr_main_db_name); session_name("DOLSESSID_".$dolibarr_main_db_name);
session_start(); session_start();
}
$user->fetch($dolibarr_auto_user); // On est pas déjà authentifié, on demande le login/mot de passe
// A l'issu de cette demande, le login et un jeton doivent avoir été placé
// en session dans dol_user et dol_token et la page rappelée.
// MODE AUTO
if (in_array('auto',$authmode) && ! $login)
{
$login=$dolibarr_auto_user;
dolibarr_syslog ("Authentification ok (en mode force)"); dolibarr_syslog ("Authentification ok (en mode force)");
} }
// MODE 2: Identification HTTP Basic
elseif (! empty($_SERVER["REMOTE_USER"])) // MODE HTTP (Basic)
if (in_array('http',$authmode) && ! $login)
{ {
// Authentification Apache OK, on initialise la session $login=$_SERVER["REMOTE_USER"];
if (! session_id()) {
session_name("DOLSESSID_".$dolibarr_main_db_name);
session_start();
} }
if (isset($_SESSION["dol_user"])) // MODE DOLIBARR
if (in_array('dolibarr',$authmode) && ! $login)
{ {
// Session existante pour ce login
$user->fetch($_SERVER["REMOTE_USER"]);
// $user=$_SESSION["session_user"];
dolibarr_syslog ("Authentification ok (en mode Basic)");
}
else
{
// Nouvelle session pour ce login
$user->fetch($_SERVER["REMOTE_USER"]);
dolibarr_syslog ("Authentification ok (en mode Basic) - nouvelle session");
$user->update_last_login_date();
$_SESSION["dol_user"]=$user;
}
}
// MODE 3: Identification depuis base de donnees
else
{
// Authentification Apache KO ou non active, pas de mode force on demande le login
require_once(DOL_DOCUMENT_ROOT."/includes/pear/Auth/Auth.php"); require_once(DOL_DOCUMENT_ROOT."/includes/pear/Auth/Auth.php");
$pear = $dolibarr_main_db_type.'://'.$dolibarr_main_db_user.':'.$dolibarr_main_db_pass.'@'.$dolibarr_main_db_host.'/'.$dolibarr_main_db_name; $pear = $dolibarr_main_db_type.'://'.$dolibarr_main_db_user.':'.$dolibarr_main_db_pass.'@'.$dolibarr_main_db_host.'/'.$dolibarr_main_db_name;
@ -125,37 +116,34 @@ else
$aDol = new DOLIAuth("DB", $params, "loginfunction"); $aDol = new DOLIAuth("DB", $params, "loginfunction");
$aDol->setSessionName("DOLSESSID_".$dolibarr_main_db_name); $aDol->setSessionName("DOLSESSID_".$dolibarr_main_db_name);
$aDol->start(); $aDol->start();
$result = $aDol->getAuth(); $result = $aDol->getAuth(); // Si deja logue avec succes, renvoie vrai, sinon effectue un redirect sur page loginfunction et renvoie false
if ($result) if ($result)
{ {
// Authentification Auth OK, on va chercher les infos du user // Authentification Auth OK, on va chercher le login
$user->fetch($aDol->getUsername()); $login=$aDol->getUsername();
dolibarr_syslog ("Authentification ok (en mode Pear)"); dolibarr_syslog ("Authentification ok (en mode Pear Base Dolibarr)");
if (isset($_POST["loginfunction"]))
{
// Si phase de login initial
$user->update_last_login_date();
}
} }
else else
{ {
if (isset($_POST["loginfunction"])) if (isset($_POST["loginfunction"]))
{ {
// Echec authentification // Echec authentification
dolibarr_syslog("Authentification ko (en mode Pear) pour '".$_POST["username"]."'"); dolibarr_syslog("Authentification ko (en mode Pear Base Dolibarr) pour '".$_POST["username"]."'");
} }
else else
{ {
// Non authentifie dolibarr_syslog("Authentification non realise; // Non authentifie
//dolibarr_syslog("Authentification non realise");
} }
// Le debut de la page a ete affiche par loginfunction. On ferme juste la page // Le debut de la page a ete affichee par par getAuth qui a utilisé loginfunction.
// On ferme donc juste la page de logon.
print "</div>\n</div>\n</body>\n</html>"; print "</div>\n</div>\n</body>\n</html>";
exit; exit;
} }
} }
/*
// MODE 4: Identification depuis ldap // MODE LDAP
else if (in_array('ldap',$authmode) && ! $login)
{ {
if ($conf->ldap->enabled) if ($conf->ldap->enabled)
{ {
@ -186,36 +174,58 @@ else
$aDol = new DOLIAuth("DB", $params, "loginfunction"); $aDol = new DOLIAuth("DB", $params, "loginfunction");
$aDol->setSessionName("DOLSESSID_".$dolibarr_main_db_name); $aDol->setSessionName("DOLSESSID_".$dolibarr_main_db_name);
$aDol->start(); $aDol->start();
$result = $aDol->getAuth(); $result = $aDol->getAuth(); // Si deja logue avec succes, renvoie vrai, sinon effectue un redirect sur page loginfunction et renvoie false
if ($result) if ($result)
{ {
// Authentification Auth OK, on va chercher les infos du user // Authentification Auth OK, on va chercher le login
$user->fetch($aDol->getUsername()); $login=$aDol->getUsername();
dolibarr_syslog ("Authentification ok (en mode Pear)"); dolibarr_syslog ("Authentification ok (en mode Pear Base LDAP)");
if (isset($_POST["loginfunction"]))
{
// Si phase de login initial
$user->update_last_login_date();
}
} }
else else
{ {
if (isset($_POST["loginfunction"])) if (isset($_POST["loginfunction"]))
{ {
// Echec authentification // Echec authentification
dolibarr_syslog("Authentification ko (en mode Pear) pour '".$_POST["username"]."'"); dolibarr_syslog("Authentification ko (en mode Pear Base LDAP) pour '".$_POST["username"]."'");
} }
else else
{ {
// Non authentifie dolibarr_syslog("Authentification non realise; // Non authentifie
//dolibarr_syslog("Authentification non realise");
} }
// Le debut de la page a ete affiche par loginfunction. On ferme juste la page // Le debut de la page a ete affichee par getAuth qui a utilisé loginfunction.
// On ferme donc juste la page de logon.
print "</div>\n</div>\n</body>\n</html>"; print "</div>\n</div>\n</body>\n</html>";
exit; exit;
} }
} }
} }
*/ }
else
{
// On est déjà en session
$login=$_SESSION["dol_user"];
}
// Charge l'objet user depuis son login
$user->fetch($login);
if (! $user->id)
{
dolibarr_print_error($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;
}
// Si user admin, on force droits sur les modules base // Si user admin, on force droits sur les modules base
if ($user->admin) if ($user->admin)
{ {

View File

@ -31,15 +31,21 @@ if (!empty ($_SERVER["REMOTE_USER"]))
die("La d&eacute;connection ne fonctionne actuellement que pour l'authentification par pear"); die("La d&eacute;connection ne fonctionne actuellement que pour l'authentification par pear");
include_once("../conf/conf.php"); include_once("../conf/conf.php");
define('DOL_DOCUMENT_ROOT', $dolibarr_main_document_root); require_once("../master.inc.php");
require_once(DOL_DOCUMENT_ROOT."/includes/pear/Auth/Auth.php");
require_once "../includes/pear/Auth/Auth.php";
dolibarr_syslog("End session in DOLSESSID_".$dolibarr_main_db_name);
session_name("DOLSESSID_".$dolibarr_main_db_name);
session_start();
session_unregister("dol_user");
$a = new DOLIAuth("DB"); $a = new DOLIAuth("DB");
$a->setSessionName("DOLSESSID_".$dolibarr_main_db_name); $a->setSessionName("DOLSESSID_".$dolibarr_main_db_name);
$a->setShowLogin (false); $a->setShowLogin (false);
$a->start(); $a->start();
if ($a->getAuth()) if ($a->getAuth()) $a->logout();
$a->logout();
header("Location: ../"); header("Location: ../index.php");
?> ?>