JeuWeb - Crée ton jeu par navigateur

Version complète : Les droits de vos administrateurs
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
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!
Aide & commentaire : http://www.jeuweb.org/board/showthread.php?tid=3107