Conseils Niveaux Utilisateur [Code Fourni]

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Conseils Niveaux Utilisateur [Code Fourni]

Re: Conseils Niveaux Utilisateur

par olivierg » 12 août 2011, 15:08

Bon voilà ce que j'ai fait, svp dites moi si ça vous parraît juste (oui je sais je met des echo partout, c'est salement codé mais bon, à l'occasion je referais du code propre).

1. j'ai crée deux tables dans ma base :

une table contenant les Modules (qui sont tout simplement des pages web en fait, auxquels mes users accèdent, mais chaque module peut être composé de plusieurs pages, comme la page de listing, une page d'ajout etc.), avec un id du module, le nom du module, et les ID des fichiers, correspondant à une variable $id_page = 'x'; sur chaque page PHP (voir plus bas)

exemple de ma table "inv_modules" (je n'ai mis que trpos modules pour l'instant, mais il y en a évidemment un paquet) :

Image

Puis une table contenant les user levels, contenant le user level id, le nom, une description, ainsi que 3 champs, un read, un update et un delete.
pour chaque user level, on a dans chaque liste (read/update/delete) l'ID du module sur lequel on a ces droits

exemple de ma table "user_levels" :

Image

on peut voir par exemple que mon user de "test" n'a les droits de lecture que sur le module d'ID 1 (inventaire serveurs), et aucun autre droits. il ne peut donc que :

- lire & updater les champs du module inventaire serveurs (interdit de supprimer)
- rien faire d'autre sur les autres modules

2. Pour éditer le tout, j'ai crée un petit panneau d'admin qui resemble à ça :

Image

lorsque l'on édite un user level, on modifie ses droits :

Image

on peut aussi modifier les modules directement, ça va de soi :

Image

3. une fois ça fait, j'ai mis, dans mes pages, un ID par page, au top de chaque page j'ai mon header dans lequel j'ai rajouté ces lignes :
$page_id = '3';                          // ID de la page en question
include ("../../header.php");
include ("../../config/mysqlconn.php");
include ("../../config/functions.php");
list($rights_read, $rights_update, $rights_delete) = CheckProfile($page_id);            // fonction de verif et definition des droits
$message = UpdateRights($rights_update);             // fonction permettant de désactiver les boutons de mise à jour/modification
et j'ai donc codé deux petites fonctions pour les droits (dans mes include) :

la première (CheckProfile):
/* ------------------------------------- */
/* CheckProfile()                        */
/* Gestion User Level                    */
/* ------------------------------------- */

function CheckProfile($page_id) {
  // on recupere le user level ID       (j'ai une table user avec le userlevel_id spécifié par user, que je met en sessions lors de sa connexion)
  $userlevel_id = $_SESSION['level'];
  // on recupere les droits de ce user level
  $get_rights = 'SELECT * FROM user_levels WHERE user_level_id = "'.$userlevel_id.'"';
  $exec_get_rights = mysql_query($get_rights);
  while ($data = mysql_fetch_assoc($exec_get_rights)) {
    // on cree des tableaux contenant les ID des modules de ce user level
    $read = explode(" ", $data['read_modules']);
    $update = explode(" ", $data['update_modules']);
    $delete = explode(" ", $data['delete_modules']);
  }
  // on initialise des variables a no
  $rights_read = 'no';
  $rights_update = 'no';
  $rights_delete = 'no';
  // on choppe le module_id dans la base correspondant a l'ID de la page actuelle
  $query_modidpage = 'SELECT module_id FROM inv_modules WHERE module_files REGEXP "[[:<:]]'.$page_id.'[[:>:]]"';
  $exec_modidpage = mysql_query($query_modidpage);
  $result_modidpage = mysql_result($exec_modidpage, 0);
  // on regarde si le user a accès à ce module avec un quelconque droit
  if (in_array($result_modidpage, $read)) {
        $rights_read = 'yes';
  }
  if (in_array($result_modidpage, $update)) {
        $rights_update = 'yes';
  }
  if (in_array($result_modidpage, $delete)) {
        $rights_delete = 'yes';
  }
  // si le user level n'a aucun droit, on exit la page
  if (($rights_read == 'no') && ($rights_update == 'no') && ($rights_delete == 'no')) {
      echo '<br><font size="2">Your User Level is not authorized to access this page</font><br>';
      exit;
  }
  // on renvoie les 3 variables
  return array($rights_read, $rights_update, $rights_delete);

}
et la seconde (et la troisieme pour le delete) :
/* ------------------------------------- */
/* UpdateRights()                        */
/* Gestion User Level pour les Updates   */
/* ------------------------------------- */

function UpdateRights($rights_update) {
  if ($rights_update == "no") {
        $msg=' DISABLED';
  } else {
        $msg='';
  }
  return $msg;
}

/* ------------------------------------- */
/* DeleteRights()                        */
/* Gestion User Level pour les delete    */
/* ------------------------------------- */

function DeleteRights($rights_delete) {
  if ($rights_delete == "no") {
        echo '<br>Your User level is not authorized to perform deletions in this Module<br>';
        exit;
  }
}
et tout marche comme sur des roulettes :)

pour le code, à chaque emplacement d'un bouton de modification de formulaire par exemple, j'ai mis ça ( ça rajoute un "DISABLED" si la personne n'a pas les droits) :
echo '<input type="submit" value="Modify" id="submit" '.$message.'> 
je devrais certainement recoder une belle fonction pour que ça gère non seulement les boutons mais aussi le reste (comme pour le delete par exemple, un truc à checked avant une requête MySQL par exemple)

et pour le delete interdit, je rajoute ça :
DeleteRights($rights_delete);


juste avant les requêtes de suppression

voilà,

si vous désirez le code du panneau d'admin complet (j'ai passé des heures dessus à cause des checkboxes) , le voici :
<?php

// -------------------------------------------------
// Header
// -------------------------------------------------

$page_title = 'User Levels Management (en dev)';
$page_id = '1';
include ("../../header.php");
include ("../../config/mysqlconn.php");
include ("../../config/functions.php");

// -------------------------------------------------
// Check sur le type de profil connecté
// -------------------------------------------------

CheckAdmin();

// -------------------------------------------------
// Code Principal
// -------------------------------------------------

echo '<table border="0" cellpadding="2" cellspacing="1" width="750">';
echo '<tr class="tkt_sectionHeader">';
echo '<td>Menu</td>';
echo '</tr>';
echo '<tr class="tkt_lightcell">';
echo '<td>';
echo '[ <b><a href="ges_userlevels.php?register">Modules registry</a></b> ] ';
echo '[ <b><a href="ges_userlevels.php?mgt">User levels Configurator</a></b> ] ';
echo '[ <b><a href="ges_userlevels.php?pageids">Files ID</a></b> ] ';
echo '</td>';
echo '</tr>';
echo '</table>';

// -------------------------------------------------
// Add user level
// -------------------------------------------------
if (isset($_GET['add'])) {

   if (isset($_POST['validateuseradd'])) {
        extract($_POST);
        $req_add = 'INSERT INTO user_levels(user_level_id,
                                        user_level_name,
                                        user_level_desc)
                        VALUES("",
                                "'.$name.'",
                                "'.$description.'")';

        if (mysql_query($req_add)) {
                echo '<br>User Level successfully added.<br>';
                write_history_mysql('[ADMIN] User Level '.$user_level_name.'added');
        } else {
                echo '<br>Error while adding user level, contact the developer<br>';
        }
   }
   echo '<br>';
   echo '<table border="0" cellpadding="2" cellspacing="1" width="450" align="center">';
   echo '<form method="post" action="ges_userlevels.php?add">';
   echo '<tr class="tkt_sectionHeader">';
   echo '<td colspan="2">User Level Add</td>';
   echo '</tr>';
   echo '<tr class="tkt_lightcell">';
   echo '<td width="100">';
   echo 'Name';
   echo '</td>';
   echo '<td>';
   echo '<input type="text" name="name" value="" size="50">';
   echo '</td>';
   echo '</tr>';
   echo '<tr class="tkt_sectionHeader2">';
   echo '<td>';
   echo 'Description';
   echo '</td>';
   echo '<td>';
   echo '<input type="text" name="description" value="" size="50">';
   echo '</td>';
   echo '</tr>';
   echo '<tr class="tkt_lightcell">';
   echo '<td colspan="2" align="center">';
   echo '<input type="submit"  name="validateuseradd" value="Create">';
   echo '</td>';
   echo '</tr>';
   echo '</form>';
   echo '</table>';
}

// -------------------------------------------------
// Register Module
// -------------------------------------------------
if (isset($_GET['register'])) {

   if (isset($_POST['validatemoduleadd'])) {
        extract($_POST);
        $insert_mod = 'INSERT INTO inv_modules(module_id,
                                                module_name,
                                                module_files)
                                VALUES("",
                                        "'.$module_name.'",
                                        "'.$module_files.'")';

        if (mysql_query($insert_mod)) {
                write_history_mysql('[ADMIN] Module Registered : '.$module_name.'');
        } else {
                echo '<br>Error while adding Module, please contact the developer.<br>';
        }
   }

   if (isset($_GET['addmodule'])) {
      echo '<br>';
      echo '<table border="0" cellpadding="2" cellspacing="1" width="450" align="center">';
      echo '<form method="post" action="ges_userlevels.php?register">';
      echo '<tr class="tkt_sectionHeader">';
      echo '<td colspan="2">Add Module</td>';
      echo '</tr>';
      echo '<tr class="tkt_lightcell">';
      echo '<td>Module Name</td>';
      echo '<td><input type="text" name="module_name" size="40"></td>';
      echo '</tr>';
      echo '<tr class="tkt_sectionHeader2">';
      echo '<td>Files (IDs, separator: space)</td>';
      echo '<td><input type="text" name="module_files" size="40"></td>';
      echo '</tr>';
      echo '<tr class="tkt_lightcell">';
      echo '<td colspan="2" align="center"><input type="submit" name="validatemoduleadd" value="Register"></td>';
      echo '</tr>';
      echo '</form>';
      echo '</table>';
      echo '<br>';
   } else {
      echo '<br>';
      echo '<center><a href="ges_userlevels.php?register&addmodule">register a module</a></center>';
   }

   echo '<br>';
   echo '<table border="0" cellpadding="2" cellspacing="1" width="750" align="center">';
   echo '<tr class="tkt_sectionHeader">';
   echo '<td colspan="3">Registered Modules</td>';
   echo '</tr>';
   echo '<tr class="tkt_sectionHeader">';
   echo '<td>Name</td>';
   echo '<td>File IDs</td>';
   echo '<td align="center">Action</td>';
   echo '</tr>';
   $all_registered_mods = 'SELECT * FROM inv_modules ORDER BY module_name';
   $exec_all_registered_mods = mysql_query($all_registered_mods);
   while ($data = mysql_fetch_assoc($exec_all_registered_mods)) {
   echo '<tr class="tkt_lightcell">';
    echo '<td>';
     echo $data['module_name'];
    echo '</td>';
    echo '<td>';
     echo $data['module_files'];
    echo '</td>';
    echo '<td align="center">';
     echo '<a href="ges_userlevels.php?register&mod='.$data['module_id'].'&name='.$data['module_name'].'"><img src="../../images/search.gif" border="0" alt="modifier"></a>&nbsp;&nbsp;&nbsp;&nbsp;';
   echo '<a href="ges_userlevels.php?register&del='.$data['module_id'].'&name='.$data['module_name'].'" OnClick="if (window.confirm(\'Are you sure you want to delete this module ?\')){return true;}else{return false;}"><img src="../../images/suppr.gif" border="0" alt="delete"></a>';
    echo '</td>';
   echo '</tr>';
   }
   echo '</table>';
}

// -------------------------------------------------
// Configurator Listing
// -------------------------------------------------
if (isset($_GET['mgt'])) {

echo '<br>';
echo '<center><a href="ges_userlevels.php?add">add a user level</a></center>';
echo '<br>';
echo '<table border="0" cellpadding="2" cellspacing="1" width="450" align="center">';
echo '<tr class="tkt_sectionHeader">';
echo '<td colspan="3">User Levels available</td>';
echo '</tr>';
$userlevels = 'SELECT * FROM user_levels ORDER BY user_level_name';
$exec_userlevels = mysql_query($userlevels);
while ($data = mysql_fetch_assoc($exec_userlevels)) {
   echo '<tr class="tkt_lightcell">';
   echo '<td>';
   echo $data['user_level_name'];
   echo '</td>';
   echo '<td>';
   echo $data['user_level_desc'];
   echo '</td>';
   echo '<td align="center" width="70">';
   echo '<a href="ges_userlevels.php?modify='.$data['user_level_id'].'&name='.$data['user_level_name'].'"><img src="../../images/search.gif" border="0" alt="modifier"></a>&nbsp;&nbsp;&nbsp;&nbsp;';
   echo '<a href="ges_userlevels.php?delete='.$data['user_level_id'].'&name='.$data['user_level_name'].'" OnClick="if (window.confirm(\'Are you sure u wanna delete this userlevel ?\')){return true;}else{return false;}"><img src="../../images/suppr.gif" border="0" alt="delete"></a>';
   echo '</td>';
}
echo '</table>';

}

// -------------------------------------------------
// Configurator validation Edition
// -------------------------------------------------

if (isset($_POST['validate_edition'])) {
    extract($_POST);
    // on reprend les valeurs originales de ce userlevel avec une requete mysql
    // (on aurait pu les envoyer dans le formulaire mais bon, j'aime le code sale)
    $req_edit = 'SELECT * FROM user_levels WHERE user_level_id = "'.$user_level_id.'"';
    $query_edit = mysql_query($req_edit);
    while ($data = mysql_fetch_assoc($query_edit)) {
        // on split le bazar
        $modules_read = explode(" ", $data['read_modules']);
        $modules_update = explode(" ", $data['update_modules']);
        $modules_delete = explode(" ", $data['delete_modules']);
        // pour chaque module existant, on regarde
        $req_mods = 'SELECT * FROM inv_modules ORDER BY module_name';
        $mods_query = mysql_query($req_mods);
        while ($row = mysql_fetch_assoc($mods_query)) {
                $module_id = $row['module_id'];
                // -----------------------
                // READ
                // si on a coché le read
                if (isset($read[$module_id])) {
                        if (in_array($row['module_id'], $modules_read)) {
                                // le module est deja en accès read
                                $null = 'null';
                        } else {
                                // on inscrit le module en accès read (on le rajoute dans le tableau)
                                $modules_read[] = $row['module_id'];
                        }
                // si le read est décoché
                } else {
                        if (in_array($row['module_id'], $modules_read)) {
                                // l'accès read à ce module doit etre désactivé (on vide l'entree du tableau)
                                while(in_array($module_id, $modules_read)) {
                                        $key = array_search($module_id, $modules_read);
                                                unset($modules_read[$key]);
                                }
                        } else {
                                // l'accès à ce module était déjà inactif
                                $null = 'null';
                        }
                }
                // -----------------------
                // UPDATE
                // si on a coché le update
                if (isset($update[$module_id])) {
                        if (in_array($row['module_id'], $modules_update)) {
                                // le module est deja en accès update
                                $null = 'null';
                        } else {
                                // on inscrit le module en accès update (on le rajoute dans le tableau)
                                $modules_update[] = $row['module_id'];
                        }
                // si le update est décoché
                } else {
                        if (in_array($row['module_id'], $modules_update)) {
                                // l'accès update à ce module doit etre désactivé (on vide l'entree du tableau)
                                while(in_array($module_id, $modules_update)) {
                                        $keu = array_search($module_id, $modules_update);
                                                unset($modules_update[$keu]);
                                }
                        } else {
                                // l'accès à ce module était déjà inactif
                                $null = 'null';
                        }
                }
                // -----------------------
                // DELETE
                // si on a coché le delete
                if (isset($del[$module_id])) {
                        if (in_array($row['module_id'], $modules_delete)) {
                                // le module est deja en accès delete
                                $null = 'null';
                        } else {
                                // on inscrit le module en accès delete (on le rajoute dans le tableau)
                                $modules_delete[] = $row['module_id'];
                        }
                // si le delete est décoché
                } else {
                        if (in_array($row['module_id'], $modules_delete)) {
                                // l'accès delete à ce module doit etre désactivé (on vide l'entree du tableau)
                                while(in_array($module_id, $modules_delete)) {
                                        $ked = array_search($module_id, $modules_delete);
                                                unset($modules_delete[$ked]);
                                }
                        } else {
                                // l'accès à ce module était déjà inactif
                                $null = 'null';
                        }
                }
        }
        // on construit une nouvelle variable avec les nouvelles valeurs du tableau
        $nouveau_read = implode(" ", $modules_read);
        $nouveau_update = implode(" ", $modules_update);
        $nouveau_delete = implode(" ", $modules_delete);
        // requete de mise a jour de la base de données pour ce user level
        $maj_db = 'UPDATE user_levels
                        SET read_modules = "'.$nouveau_read.'",
                                update_modules = "'.$nouveau_update.'",
                                delete_modules = "'.$nouveau_delete.'"
                        WHERE user_level_id = "'.$user_level_id.'"';

        if (mysql_query($maj_db)) {
                write_history_mysql('[ADMIN] User Level '.$user_level_name.' updated');
                echo '<script language="Javascript">
                      <!--
                          document.location.replace("ges_userlevels.php?mgt");
                      // -->
                      </script>';
        } else {
                echo '<br>Error during the update, contact the developer.<br>';
        }
    }
}

// -------------------------------------------------
// Configurator Edition
// -------------------------------------------------
if (isset($_GET['modify'])) {
   $user_level_id = $_GET['modify'];
   $user_level_name = $_GET['name'];
   echo '<br>';
   echo '<table border="0" cellpadding="2" cellspacing="1" width="550" align="center">';
   echo '<form method="post" action="ges_userlevels.php">';
   echo '<tr class="tkt_sectionHeader">';
   echo '<td colspan="4">';
   echo 'Editing User Level Rights for : <font size="2" color="red">'.$user_level_name.'</font>';
   echo '<input type="hidden" name="user_level_id" value="'.$user_level_id.'">';
   echo '<input type="hidden" name="user_level_name" value="'.$user_level_name.'">';
   echo '</td>';
   echo '</tr>';
   echo '<tr class="tkt_sectionHeader">';
   echo '<td width="430">Module Name</td>';
   echo '<td width="40" align="center">Read</td>';
   echo '<td width="40" align="center">Update</td>';
   echo '<td width="40" align="center">Delete</td>';
   echo '</tr>';
   // on récupère les valeurs du user level choisi
   $req_edit = 'SELECT * FROM user_levels WHERE user_level_id = "'.$user_level_id.'"';
   $query_edit = mysql_query($req_edit);
   while ($data = mysql_fetch_assoc($query_edit)) {
        // on split les champs pour recuperer les droits de chaque module
        $modules_read = explode(" ", $data['read_modules']);
        $modules_update = explode(" ", $data['update_modules']);
        $modules_delete = explode(" ", $data['delete_modules']);
        // on liste tous les modules dispo
        $req_mods = 'SELECT * FROM inv_modules ORDER BY module_name';
        $mods_query = mysql_query($req_mods);
        while ($row = mysql_fetch_assoc($mods_query)) {
                // pour chaque module, on regarde si ce module est dans le tableau read, update ou delete pour ce user level
                // si c'est le cas, on coche la case, sinon, on ne coche rien
                $module_id = $row['module_id'];
                //
                echo '<tr class="tkt_lightcell">';
                // nom
                echo '<td width="430">'.$row['module_name'].'</td>';
                // read
                if (in_array($row['module_id'], $modules_read)) {
                        echo '<td width="40" align="center"><input type="checkbox" name="read['.$row['module_id'].']" value="" CHECKED></td>';
                } else {
                        echo '<td width="40" align="center"><input type="checkbox" name="read['.$row['module_id'].']" value=""></td>';
                }
                // update
                if (in_array($row['module_id'], $modules_update)) {
                        echo '<td width="40" align="center"><input type="checkbox" name="update['.$row['module_id'].']" value="" CHECKED></td>';
                } else {
                        echo '<td width="40" align="center"><input type="checkbox" name="update['.$row['module_id'].']" value=""></td>';
                }
                // delete
                if (in_array($row['module_id'], $modules_delete)) {
                        echo '<td width="40" align="center"><input type="checkbox" name="del['.$row['module_id'].']" value="" CHECKED></td>';
                } else {
                        echo '<td width="40" align="center"><input type="checkbox" name="del['.$row['module_id'].']" value=""></td>';
                }
                //
                echo '</tr>';
        }
   }
   echo '<tr class="tkt_lightcell">';
   echo '<td colspan="4" align="center"><input type="submit" name="validate_edition" value="Modify"></td>';
   echo '</tr>';
   echo '</form>';
   echo '</table>';
}

// -------------------------------------------------
// Footer
// -------------------------------------------------

include ("../../footer.php");
?>

la seule chose galère, c'est attribuer un ID à chaque page PHP "manuellement" si j'ose dire (je vais me créer un script qui rajoute un ID automatiquement sur chaque page pour la première fois, et à partir de là, pareil pour chaque nouveau module)

merci !

ps :je suis ouvert à tout conseil / toute critique, soyez indulgents, je débute complètement en PHP, alors je code très salement et n'ai pas toujours les bonnes notions :)

Re: Conseils Niveaux Utilisateur

par olivierg » 11 août 2011, 19:52

j'ai réussi à coder mon interface d'admin et à faire ma base déjà, demain je m'attaque au reste et au système de fonction / détection dans les pages
si quelqu'un a besoin dites moi je fournirais le code source (ou je le posterais pour que vous puissiez le corriger :p)

Re: Conseils Niveaux Utilisateur

par olivierg » 11 août 2011, 09:03

je pensais à ça également en effet, bon, je vais coder un truc à ma façon et je posterais mon code dans les jours si ça intéresse quelqu'un :)

Re: Conseils Niveaux Utilisateur

par Skw33d » 10 août 2011, 19:57

Une solution pas mal qui pour éviter les problèmes de mémoire et éviter les requêtes SQL à répétions est vraiment de rester sur le système de fichier.
Tu pourrais créer un fichier access_level.php qui contiendrait tous les niveaux d'accès dedans sous forme de tableau sérialisé ou en json.
A chaque fois tu inclus ce fichier lorsqu'on appelle une page.

Je ne sais pas comment fonctionne tes modules ? Une page == un module ? Si oui, le module pourrait être identifié par son nom de page sinon faudrait leur assigner un ID.

Ensuite il te faudrait une fonction qui te servira à vérifier si le niveau de l'utilisateur permet d'effectuer l'action pour le module spécifié. La fonction pourrait être comme celle ci :

@param $nom_page : La page / nom / ID du module
@param $action : Read, write or delete
function checkLevel($nom_page,$action)

Dans la fonction tu vérifierais si pour le module $nom_page, le level $_SESSION possède la possibilité d'effectuer $action, la fonction renverrait donc true or false.

Re: Conseils Niveaux Utilisateur

par olivierg » 10 août 2011, 10:56

A la connexion de l'utilisateur, on vient récupérer l'ID du membre et le niveau du membre.
On stocke ces données en session et après on a plus qu'a faire le lancement d'une fonction quand l'utilisateur arrive sur la page pour vérifier que l'utilisateur a le niveau requis.
c'est ce que je fais actuellement avec mon code admin/user. j'ai mis une session "level" et suivant le level, on a, ou pas, le droit d'accéder à la page, d'afficher un menu etc. avec une fonction toute bête dans mes include, que je met au début de chaque page que je dois protéger :
function CheckAdmin() {
if ($_SESSION['level'] != "1" ) {
 echo '<br><br>';
 echo '<font face="verdana">Vous devez etre Administrateur pour acc&eacute;der a cette fonctionnalit&eacute;</font>';
 echo '<br><br>';
 exit;
}
}
j'aimerais faire pareil mais avec des niveaux "customisables", créer un admin panel avec des niveaux à définir, par exemple on peut créer "niveau1", "niveau2", "niveauspécial", et cocher des cases suivant les modules auxquels on veut accéder

mais je ne sais pas trop quelle méthode adopter pour coder ça proprement, si vous avez des idées, c'est le but du sujet =)

Re: Conseils Niveaux Utilisateur

par Skw33d » 09 août 2011, 21:34

le niveau, l'id et le code d'autorisation sont passés d'une page à l'autre, et la fonction de vérification:
1) consulte la table et en extrait le niveau de l'id:
a) le risque est que l'on ait usurpé un id correspondant à un niveau supérieur mais:
2) vérifie que le niveau passé est le même que le niveau trouvé
- il faudrait avoir déniché l'id et le niveau qui font la paire, mais à partir de quoi?
3) consulte une table des sessions stockant le code d'autorisation, l'id à qui on l'a attribué, le niveau de cet id.
pour chaque id, une seule connexion est acceptée au même moment
a) risque de piratage de la base de données mais:
une autorisation a une durée limitée...
Utiliser uniquement les sessions t'épargnerait ces étapes en une simple étape unique de stockage des informations en session au moment de la connexion :

A la connexion de l'utilisateur, on vient récupérer l'ID du membre et le niveau du membre.
On stocke ces données en session et après on a plus qu'a faire le lancement d'une fonction quand l'utilisateur arrive sur la page pour vérifier que l'utilisateur a le niveau requis.

Re: Conseils Niveaux Utilisateur

par sirakawa » 09 août 2011, 20:16

Dire que je suis totalement content serait mentir.
J'ai dit une bêtise:
Dans la page unique d'entrée, il n'y a aucune information de ce type:
on demande identifiant et mot de passe, et une deuxième page calcule id, niveau, code d'autor et oriente en fonction du résultat trouvé:
ex:
index.html
-> identifiant = toto, passe= vvv
--> tester_identifiants.php ==> id = 312, autor =##, niveau =1
--->gestion_1.php dont les menus ne comportent qu'une part des possibilités.

index.html
-> identifiant = Laverdure
--> tester_identifiants.php ==>id =714, autor =#@@@#, niveau =4
--->gestion_4.php dont les menus comportent la part des possibilités autorisées au niveau 4

tous les autres modules ne requièrent que l'id numérique, l'autor et le niveau

le niveau, l'id et le code d'autorisation sont passés d'une page à l'autre, et la fonction de vérification:
1) consulte la table et en extrait le niveau de l'id:
a) le risque est que l'on ait usurpé un id correspondant à un niveau supérieur mais:
2) vérifie que le niveau passé est le même que le niveau trouvé
- il faudrait avoir déniché l'id et le niveau qui font la paire, mais à partir de quoi?
3) consulte une table des sessions stockant le code d'autorisation, l'id à qui on l'a attribué, le niveau de cet id.
pour chaque id, une seule connexion est acceptée au même moment
a) risque de piratage de la base de données mais:
une autorisation a une durée limitée...

J'avais pensé à rajouter à la fonction un test sur l'existence d'au moins une partie des informations transmises normalement et dont on est sûr qu'elles ont une valeur en fonctionnement normal...

Ce logiciel de dépouillement d'enquêtes
http://www.cs.cornell.edu/andru/civs.html
a un procédé d'ouverture contrôlée. Mais j'ai la flemme de remplir la page avant le téléchargement...
Ça fait un bail que je me dis que je devrais aller voir...

Re: Conseils Niveaux Utilisateur

par Skw33d » 09 août 2011, 18:06

A chaque page est associé un fichier include de même nom et d'extension
L'idée est bonne. Ça peut facilement faire une gestion dynamique des droits et on pourrait aussi par exemple lors de l'appel de la page faire que si le fichier de droit à inclure n'existe pas pour cette page on donne un certain droit à la page par défaut.

Par contre un truc m'a vraiment choqué !
Ces trois éléments (son id, son b=niveau et son autorisation) sont propagés d'une page à l'autre par des <input type='hidden'...> et testés à chaque page même si la page est appelée par une autre qui a déjà testé. J'avais pensé à me servir des sessions, mais comme celles-ci écrivent des fichiers, j'ai préféré procéder ainsi (valeurs passées par POST). L'idée est de montrre le moins possible ce qu'on fait et d'interdire les accès indirects.
En gros un utilisateur peut tranquillement se modifier son droit sans en demander l'avis à qui que ce soit ! Wow ! Après je suis d'accord que les solutions varient selon le niveau de sécurité requis par l'application. En gros on pourrait utiliser ta solution que si on ne demande pour l'application un niveau de sécurité moindre...
J'avais pensé à me servir des sessions, mais comme celles-ci écrivent des fichiers
Qu'est ce qui te gêne la dedans ?

Re: Conseils Niveaux Utilisateur

par olivierg » 09 août 2011, 17:34

merci pour vos expériences, c'est intéressant, je vais préparer quelques tests avec fonctions & includes, c'est pas bête ton fichier include avec le niveau requis, mais donc si je veux administrer (customiser) les niveaux dans un panneau d'admin, je dois faire en sorte que le formulaire édite directement dans le fichiers include ? (tu ne met pas cette info en base de données ?)

remarque je peux faire en sorte que les fichiers include prennent l'info en base aussi.. peut-être plus simple..

Re: Conseils Niveaux Utilisateur

par sirakawa » 09 août 2011, 15:37

Pour avoir mal réfléchi au même sujet avant de me lancer, j'ai dû revoir toute une série de pages.
Voici comment c'est conçu en ce moment:
Tous les utilisateurs sont stockés dans une seule table: chacun a un id, oeuf corse, et un niveau d'utilisateur.

A chaque page est associé un fichier include de même nom et d'extension différente (à creer_x.php est associé creer_x_fr.inc) comportant les constantes de messages (pour la traduction éventuelle) et une variable niveau_requis.
Lors de sa connexion, l'utilisateur se voit attribuer, invisiblement bien sûr, un code d'autorisation et son niveau.
Ces trois éléments (son id, son b=niveau et son autorisation) sont propagés d'une page à l'autre par des <input type='hidden'...> et testés à chaque page même si la page est appelée par une autre qui a déjà testé. J'avais pensé à me servir des sessions, mais comme celles-ci écrivent des fichiers, j'ai préféré procéder ainsi (valeurs passées par POST). L'idée est de montrre le moins possible ce qu'on fait et d'interdire les accès indirects.

En fin on peut utiliser javascript pour modifier l'action d'un post en fonction du niveau d'autorité, ce qui, en dépit des hurlements du Validateur XML, simplifie:
<button type ='submit' onclick = 'change_action($niveau_autorite)'>OK</button>

Re: Conseils Niveaux Utilisateur

par Mazarini » 09 août 2011, 14:39

Bonjour,

Il n'y a pas de solutions miracle pour définir les autorisations. Cela dépend des choix des utilisateurs.

Pour contrôler les autorisations, j'utilise en générale une fonction avec comme paramètre le module et la fonction (lire, modifier...). Pour info l'utilisateur connecté est une donnée globale et donc je ne la passe en paramètre.
L'utilisation de ce système permet de concentrer la détermination de l'autorisation à un seul endroit et d'en modifier la gestion sans impact sur les modules.

Conseils Niveaux Utilisateur [Code Fourni]

par olivierg » 09 août 2011, 11:39

Bonjour,

J'ai besoin de vos conseils pour l'un de mes développements.

Sur mon intranet j'ai actuellement un système d'authentification classique (user en base, pwd md5, sessions).
j'ai deux niveaux utilisateur (user, id 0 & admin, id 1).

il y a certaines pages du pannea d'admin limitées à l'admin (juste une fonction qui vérifie si la session level du user est 1, sinon exit).

mon intranet est composé de plusieurs "modules" (les sections), certains modifiables (commes des inventaires avec des entrées qu'on peut modifier).

j'aimerais aujourd'hui ajouter des niveaux utilisateur, comme read only, spécial etc.. avec des accès "par module"
par exemple j'aurais un panneau d'administration avec les niveaux d'utilisateur définis, et en face, des cases à cocher pour les modules et le type d'accès

exemple :

Edition de l'accès "blabla 1"

Code : Tout sélectionner

modules read only modify delete inventaire machin x x x inventaire truc x x x gestion des IP x x x
etc.. bref un truc tout bête comme ça.

je pense à plusieures méthodes méthodes pour coder ça, quelle serait d'après vous la meilleure ? et comment gérer cela ?
dois-je "attribuer" à chaque module un "ID" (que je configure par exemple avec le chemin vers la page php du module ?) pour faire cette édition ?
après comment gérer l'accès ? dois-je faire une fonction de check et suivant le résultat, on exécute, ou non, les requêtes ? ou je grise les boutons de modification (je désactive les input submit) si le user n'a pas les droits etc..

en bref, si vous avez déjà développé un truc du genre, quel est le moyen le plus simple de mettre cela en place ?

merci pour vos lumières

amicalement,