Optimisation chargement permissions

This commit is contained in:
Laurent Destailleur 2007-02-28 03:13:34 +00:00
parent bfe0fea6a5
commit a36e89e585

View File

@ -80,6 +80,9 @@ class User
//! Liste des entrepots auquel a acces l'utilisateur
var $entrepots;
var $tab_loaded=array(); // Tableau pour signaler les permissions deja chargées
/**
* \brief Constructeur de la classe
* \param DB Handler accès base de données
@ -435,97 +438,103 @@ class User
}
/**
\brief Charge dans l'objet user, la liste des permissions auxquelles l'utilisateur a droit
\param module nom du module dont il faut récupérer les droits ('' par defaut signifie tous les droits)
*/
function getrights($module='')
{
dolibarr_syslog('User::Getrights id='.$this->id.' module='.$module, LOG_DEBUG);
/**
\brief Charge dans l'objet user, la liste des permissions auxquelles l'utilisateur a droit
\param module nom du module dont il faut récupérer les droits ('' par defaut signifie tous les droits)
*/
function getrights($module='')
{
if ($module && isset($this->tab_loaded[$module]) && $this->tab_loaded[$module]) { return; } // Le fichier de ce module est deja chargé
if ($this->all_permissions_are_loaded)
{
// Si les permissions ont déja été chargé pour ce user, on quitte
return;
}
// Récupération des droits utilisateurs + récupération des droits groupes
// D'abord les droits utilisateurs
$sql = "SELECT r.module, r.perms, r.subperms";
$sql .= " FROM ".MAIN_DB_PREFIX."user_rights as ur, ".MAIN_DB_PREFIX."rights_def as r";
$sql .= " WHERE r.id = ur.fk_id AND ur.fk_user= ".$this->id." AND r.perms IS NOT NULL";
$result = $this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
$i = 0;
while ($i < $num)
{
$row = $this->db->fetch_row($result);
if ($this->all_permissions_are_loaded)
{
// Si les permissions ont déja été chargé pour ce user, on quitte
return;
}
// Récupération des droits utilisateurs + récupération des droits groupes
dolibarr_syslog('User::Getrights id='.$this->id.' module='.$module, LOG_DEBUG);
// D'abord les droits utilisateurs
$sql = "SELECT r.module, r.perms, r.subperms";
$sql .= " FROM ".MAIN_DB_PREFIX."user_rights as ur, ".MAIN_DB_PREFIX."rights_def as r";
$sql .= " WHERE r.id = ur.fk_id AND ur.fk_user= ".$this->id." AND r.perms IS NOT NULL";
$result = $this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
$i = 0;
while ($i < $num)
{
$row = $this->db->fetch_row($result);
if ($row[1])
{
if ($row[2])
{
if (! $this->rights->$row[0] ||
(is_object($this->rights->$row[0]) && ! $this->rights->$row[0]->$row[1]) ||
(is_object($this->rights->$row[0]->$row[1])) )
{
$this->rights->$row[0]->$row[1]->$row[2] = 1;
}
}
else
{
$this->rights->$row[0]->$row[1] = 1;
}
if ($row[1])
{
if ($row[2])
{
if (! $this->rights->$row[0] ||
(is_object($this->rights->$row[0]) && ! $this->rights->$row[0]->$row[1]) ||
(is_object($this->rights->$row[0]->$row[1])) )
{
$this->rights->$row[0]->$row[1]->$row[2] = 1;
}
}
else
{
$this->rights->$row[0]->$row[1] = 1;
}
}
$i++;
}
$this->db->free($result);
}
}
$i++;
}
$this->db->free($result);
}
// Maintenant les droits groupes
$sql = " SELECT r.module, r.perms, r.subperms";
$sql .= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr, ".MAIN_DB_PREFIX."usergroup_user as gu, ".MAIN_DB_PREFIX."rights_def as r";
$sql .= " WHERE r.id = gr.fk_id AND gr.fk_usergroup = gu.fk_usergroup AND gu.fk_user = ".$this->id." AND r.perms IS NOT NULL";
// Maintenant les droits groupes
$sql = " SELECT r.module, r.perms, r.subperms";
$sql .= " FROM ".MAIN_DB_PREFIX."usergroup_rights as gr, ".MAIN_DB_PREFIX."usergroup_user as gu, ".MAIN_DB_PREFIX."rights_def as r";
$sql .= " WHERE r.id = gr.fk_id AND gr.fk_usergroup = gu.fk_usergroup AND gu.fk_user = ".$this->id." AND r.perms IS NOT NULL";
$result = $this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
$i = 0;
while ($i < $num)
{
$row = $this->db->fetch_row($result);
$result = $this->db->query($sql);
if ($result)
{
$num = $this->db->num_rows($result);
$i = 0;
while ($i < $num)
{
$row = $this->db->fetch_row($result);
if (strlen($row[1]) > 0)
{
if (strlen($row[1]) > 0)
{
if (strlen($row[2]) > 0)
{
$this->rights->$row[0]->$row[1]->$row[2] = 1;
}
else
{
$this->rights->$row[0]->$row[1] = 1;
}
if (strlen($row[2]) > 0)
{
$this->rights->$row[0]->$row[1]->$row[2] = 1;
}
else
{
$this->rights->$row[0]->$row[1] = 1;
}
}
$i++;
}
$this->db->free($result);
}
}
$i++;
}
$this->db->free($result);
}
if ($module == '')
{
// Si module etait non defini, alors on a tout chargé, on peut donc considérer
// que les droits sont en cache (car tous chargés) pour cet instance de user
$this->all_permissions_are_loaded=1;
}
}
if (! $module)
{
// Si module etait non defini, alors on a tout chargé, on peut donc considérer
// que les droits sont en cache (car tous chargés) pour cet instance de user
$this->all_permissions_are_loaded=1;
}
else
{
// Si module défini, on considère chargé en cache que le module
$this->tab_loaded[$module]=1;
}
}
/**
* \brief Change statut d'un utilisateur