JeuWeb - Crée ton jeu par navigateur
Les droits de vos administrateurs - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Les droits de vos administrateurs (/showthread.php?tid=2233)



Les droits de vos administrateurs - Aro - 02-01-2008

Hello Smile
Alors j'explique le but de ce script, j'utilise sur mon site trois niveaux de hiérarchie dans l'administration:
- les administrateurs, êtres omnipotents (access 3);
- les opérateurs, qui ont chacun une zone d'action (access 2);
- les agents, qui sont subalternes de opérateurs dans leurs zones (access 1).

En effet, le système administrateur/modérateur habituel est très limité et limitant...
Il me fallait donc trouver un moyen d'autoriser chaque agent et opérateur à utiliser uniquement les parties du panneau d'admin qui lui étaient attribuées et à lui interdire les autres.
Voici ce script que j'espère assez bien commenté.

J'utilise deux tables:
- membres_infos : on y trouve les infos de base du membre.
¤ colonne id qui contient l'id du membre (original avouez ^^)
¤ colonne rang qui content l'access du membre (0=utilisateur, etc...)

- admin_access : on y trouve les infos sur les droits du membres.
¤ colonne userid qui contient l'id du membre de l'autre table
¤ colonnes aussi nombreuses que vous voulez avec pour valeur 0 ou 1 selon le cas où le membre a accès ou non à le zone qui est nom de la colonne.

Au moment de la connexion:
Code PHP :
<?php 
/* je vous refais pas tout le script de connexion, si vous en avez besoin exprimez vous!
Partons du principe que le membre se connecte, que son pseudo est $pseudo et que les les information de la table membres_infos soit dans le tableau $data */

$_SESSION['id'] = $data['id'];
$_SESSION['rang'] = $data['rang'];

Ensuite, comme je suis une feignasse et que j'ai pas trop envie de me retaper tout le code sur chaque page, voyons une page fonctions.php:
Code PHP :
<?php 
function isAllow($location) // on envoie la zone à laquelle le membre veut se connecter à la fonction
{
$req1 = mysql_query("SELECT '".$location."' FROM admin_access WHERE userid='".$_SESSION['id']."'");
$data1 = mysql_fetch_array($req1);

if (
$data1[$location] == 0 && $_SESSION['rang'] != 3) // Si le mec est noté comme n'ayant pas accès à la zone et qu'il n'est pas administrateur
{
exit(
"Vous n'avez pas accès à cette zone!"); // On le bloque
}
elseif (
$data1[$location] == 0 && $_SESSION['rang'] == 3) // Si le mec est noté comme n'ayant pas accès à la zone mais qu'il est admin
{
echo
'Votre statut d\'administrateur vous permet de passer malgré votre manque de pouvoir sur cette zone';
}
}

Et là vous me dites, c'est bien tout ça... mais pouvoir modifier les access de votre Staff c'est mieux! Et ça tombe bien, je trouve aussi.
Voyons la page admin.php:
Code PHP :
<?php 
//Notre page va savoir ce qu'elle doit faire par la variable $_GET['mode']
if (isset($_GET['mode'])) { $mode = $_GET['mode']; }
else {
$mode = 'liste'; }
// Si cette variable est définie, c'est bon. Par défaut, on affiche la liste du Staff

switch($mode) // Certains n'aiment pas les switch, mais là c'est très pratique pour voir ce qui sa cache dans $mode
{
case
'liste' : //si $mode = 'liste' on affiche la liste du Staff
echo '<TABLE>
<TR>
<TH>Pseudo</TH>
<TH>Access</TH>
<TH>Pouvoirs</TH>
</TR>'
; // On va mettre les membres du Staff dans un beau tableau!
$req_liste("SELECT pseudo, rang FROM membres_info WHERE rang > 0 "); // Sélectionnons les pseudos et access numériques des membres du Staff
while ($data_liste = mysql_fetch_array($req_liste)) // On fait défiler la liste du Staff
{
echo
'<TR>
<TD> '
.stripslashes($data_liste['pseudo']).' </TD>
<TD> '
.$data_liste['rang'].' </TD>
<TD><a href="admin.php?mode=edit&id='
.$data_liste['id'].'"> Gérer </a></TD>
</TR>'
; // Un lien pour gérer les zones d'accès du membre en prime
}
echo
'</TABLE>';
break;
case
'edit' : // Si on est là pour modifier les access d'un membre...
if(!isset($_GET['id'])) { exit ("Erreur!"); } // Si on n'a pas l'id du membre à modifier... il y a un problème!
else { $id = $_GET['id']; }

if(isset(
$_POST['verif'])) //Si on a déjà validé le formulaire
{
$req1 = mysql_query("SELECT * FROM admin_access WHERE userid='".$id."'"); // On récupère les actuelles valeurs en BDD
$data1 = mysql_fetch_assoc($req1);

$fields = mysql_list_fields("base_de_donnees", "admin_access"); // On récupère la liste des champs de la table admin_access
$columns = mysql_num_fields($fields); // On compte le nombre de champs

for ($i = 1; $i < $columns; $i++) // boucle avec le nombre de champs moins le champs pseudo
{
$fieldname = mysql_field_name($fields, $i); // on récupère le nom de chaque champs un à un
if ($data1[$fieldname] != $_POST[$fieldname]) // Si la valeur que l'utilisateur a entrée est différente de celle en BDD
{
mysql_query('UPDATE admin_access SET '.$fieldname.'='.$_POST[$fieldname].' WHERE userid='.$id.'') or die(mysql_error()); // On place la nouvelle valeur en BDD
echo 'Le champ '.$fieldname.' a été passé à la valeur '.$_POST[$fieldname].'. <BR />'; // On écrit l'action effectuée à l'écran
}
}
}
else
// Si le formulaire n'est pas encore validé
{
echo
'<FORM method="post">
<input type="hidden" name="verif" />
<TABLE>'
; // Ce input sert à vérifier si le formulaire a été ou non validé

$fields = mysql_list_fields("base_de_donnees", "admin_access"); // Liste des champs
$columns = mysql_num_fields($fields); // Nombre de champs

echo '<TR>';
for (
$i = 1; $i < $columns; $i++) // Boucle avec les champs sauf le pseudo
{
echo
'<TH>'.mysql_field_name($fields, $i).'</TH>'; // On écrit le nom du champs en titre de la colonne
}

$req1 = mysql_query("SELECT membres_infos.pseudo, admin_access.* FROM membres_infos INNER JOIN admin_access ON membres_infos.id = admin_access.userid WHERE membres_infos.id = '".$id."'"); // On récupère le pseudo et les access du membre
$data1 = mysql_fetch_assoc($req1)

echo
'<TR>
<TD>'
.stripslashes($data1['pseudo']).'</TD>'; // On écrit le pseudo du bonhomme dans la première colonne

for ($i = 1; $i < $columns; $i++) // Encore elle...
{
$fieldname = mysql_field_name($fields, $i); // On récupère le nom de la colonne
echo '<TD>
<SELECT name="'
.$fieldname.'">
<OPTION value="0" '
; if ($data1[$fieldname] == 0) { echo 'selected'; } echo'>0</OPTION>
<OPTION value="1" '
; if ($data1[$fieldname] == 1) { echo 'selected'; } echo '>1</OPTION>
</SELECT></TD>'
; // un SELECT avec le nom du champ. Les deux valeurs possibles sont 0et 1 (ouvert et fermé) et on selectionne selon la valeur actuelle.
}

echo
'</TR>
<TR>
<TD colspan="4"><input type="submit" /></TD>
<TD colspan="3"><input type="reset"></TD>
</TR>
</FORM>
</TABLE>'
;
}
break;
}

Voili Voilou Smile Je vois pas ce qu'il y a à dire de plus, j'espère que ce 'tit tuto vous servira et si vous avez des idées ou améliorations, n'hésitez pas!


RE: Les droits de vos administrateurs - Plume - 03-01-2008

Aide & commentaire : http://www.jeuweb.org/board/showthread.php?tid=3107