GESTION DES ROLES

a marqué ce sujet comme résolu.

# Espace Admin avec gestion des rôles

Bonjour, j'essaye en vins d'afficher les liens du menu selon la session dans laquelle on se trouve,
mais tous liens s'affichent que l'on soit sur Admin, éditeur ou visiteur.
Merci pour votre aide.

1. class/userManager.php


class userManager {

    private $db;
 
    public function __construct($db) {

        $this->setDb($db);
    }

    public function setDb(PDO $dbh) {

        return $this->db = $dbh;
    }

    public function displayMenu($user_role_id) {

         try {

            $sql = 'SELECT A.name, A.slug
                    FROM user_action AS A
                    INNER JOIN user_permission AS P
                    ON A.actionID = P.action_id
                    AND min_role_id < :user_role_id';

            echo $sql;
 
            $stmnt = $this->db->prepare($sql);
            $stmnt->execute(array(

                ':user_role_id' => $user_role_id
            ));

            while($row = $stmnt->fetch(PDO::FETCH_ASSOC)) {

                $menu_data[] = $row;
            }

            if(isset($menu_data)) {

                return $menu_data;
            }
            else {

                return false;
            }
        }
        catch(PDOException $e) {

            echo 'Une erreur est survenue lors de la récupération d\'une des données dans la base.';
            echo '<br>';
            echo 'Message d\'erreur : ' . $e->getMessage();
        }
    }

    public function checkUserPermission($action_slug, $user_role_id) {

        try {
        
            $sql = 'SELECT P.action_id, min_role_id
                    FROM user_permission AS P
                    INNER JOIN user_action AS A
                    ON P.action_id = A.actionID
                    AND A.slug = :action_slug';
                    

            $stmnt = $this->db->prepare($sql);
            $stmnt->execute(array(

                ':action_slug' => $action_slug
            ));

            while($row = $stmnt->fetch(PDO::FETCH_ASSOC)) {

                $min_role_id = $row['min_role_id'];

                if($min_role_id > $user_role_id) {

                    return false;
                }
                else {

                    return true;
                }
            }
        }
        catch(PDOException $e) {

            echo 'Une erreur est survenue lors de la récupération d\'une des données dans la base.';
            echo '<br>';
            echo 'Message d\'erreur : ' . $e->getMessage();
        }
    }
}


2. process/process-display-menu.php 


$role = isset($_SESSION['role']) ? $_SESSION['role'] : TRUE;

$manager = new userManager($db);
$menu_items = $manager->displayMenu($role);

$menu_html = '';

foreach($menu_items as $menu_item) {

    $name = $menu_item['name'];
    $slug = $menu_item['slug'];

    $menu_html .= '<li><a href="' . $slug . '.php">' . $name . '</a></li>' . "\n";
}


3. process/process-user-permission.php


$action_slug = substr($filename, 0, 4);

$level = isset($_SESSION['level']) ? $_SESSION['level'] : TRUE;

$manager = new userManager($db);
$userPermission = $manager->checkUserPermission($action_slug, $level);

if($userPermission === false) {

    echo 'Erreur. Cette page n\'existe pas.';

    exit;
}


4. admin/menu.php


require('../process/process-display-menu.php');

?>

<ul class="menu">
    <?php echo $menu_html; ?>
    <li><a href="../index.php">Site web</a></li>
    <li><a href="logout.php">Déconnexion</a></li>
</ul>


5. admin/index.php


require('../include/inc-connexion.php');
require('../include/inc-config.php');
require('../include/inc-identification-user.php');

$filename = basename(__FILE__);
require('../process/process-user-permission.php');

require('menu.php');

https://imagizer.imageshack.com/img922/3593/sLwld7.png https://imagizer.imageshack.com/img923/2979/AIY5lj.png https://imagizer.imageshack.com/img922/6676/OTbRws.png

Bonjour @ab1011,

Je pense qu’il serait plus utile que tu apprennes à débugger plutôt qu’on le fasse "à ta place" donc je vais essayer d’expliquer comment approcher ce genre de problèmes. En soi, c’est simple, tu pars de ce qui ne marche pas et tu remontes pas à pas jusqu’à arriver à quelque qui cloche.

(Note avant que je me lance : je n’ai plus fait de PHP depuis des années donc tu m’excuseras si l’une ou l’autre de mes remarques sont approximatives ou fausses, l’important c’est le concept)

Commençons par ton dernier message, tu dis que $role est bien défini et retourne 1. C’est une bonne nouvelle, au moins on sait que la partie session fonctionne. Si je comprends bien tes valeurs en BDD, la valeur 1 signifie que dans ton cas, tu es connecté en tant qu’éditeur ? Si ce n’est pas le cas, il faudra regarder à pourquoi tu as la valeur 1 alors que tu n’es pas un éditeur. Mais ok, admettons que tu sois bel et bien connecté comme éditeur.

La prochaine étape est de s’attarder à la ligne $menu_items = $manager->displayMenu($role); et examiner quels menus sont retournés. Sont-ils corrects ou pas ? Si oui, ça veut dire que c’est plus loin que ça cloche. Si non, il va falloir jeter un oeil à la méthode displayMenu.

Disons que les menus ne sont pas correctement retournés (c’est quelque chose que tu dois confirmer), tu peux alors essayer d’examiner quelles sont les valeurs retournées par ta requête SQL et potentiellement exécuter la requête manuellement dans ta BDD pour voir si tu vois le même comportement. En y jetant un coup d’oeil, je vois la ligne AND min_role_id < :user_role_id'. Est-ce bien correct ? Ne devrait-ce pas être <= ?

Bref, il faut vraiment s’y prendre pas à pas, examiner chaque étape sans vouloir sauter les étapes et tu devrais aisément trouver d’où vient le souci.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte