IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

espace admin avec rôles et permissions


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Dépanneur informatique
    Inscrit en
    Septembre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Dépanneur informatique

    Informations forums :
    Inscription : Septembre 2021
    Messages : 31
    Par défaut espace admin avec rôles et permissions
    Bonjour, petit problème pour l'affichage des liens vers les pages autorisés pour tel ou tel utilisateur. (Administrateur, Editeur, etc.).

    Le var_dump($menu_items) => C:\wamp64\www\projet-images-en-poo-et-pdo\process\process-display-menu.php:9 : booléen faux

    Une petite aide serais sympa, voici mon code :

    Nom : table user.PNG
Affichages : 285
Taille : 38,7 Ko
    Nom : table user_action.PNG
Affichages : 270
Taille : 30,8 Ko
    Nom : table user_permission.PNG
Affichages : 248
Taille : 26,1 Ko
    Nom : table user_role.PNG
Affichages : 265
Taille : 18,0 Ko

    class/Users.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    class Users {
     
        function displayMenu($user_role_id) {
     
            $mysqli = new mysqli('localhost', 'root', '', 'projet_image');
            $mysqli->set_charset("utf8");
     
            if($mysqli->connect_errno) {
     
                printf("Echec de la connexion: %s\n", $mysqli->connect_error);
     
                exit();
            }
     
            $sql = 'SELECT A.name, A.slug
                    FROM user_action AS A
                    INNER JOIN user_permission AS P
                    ON(A.actionID = P.actionID
                    AND P.roleID < "' . $user_role_id . '")';
     
            $result = $mysqli->query($sql);
     
            if(!$result) {
     
            echo 'Une erreur est survenue lors de la récupération des données 
                  dans la base. Message d\'erreur : ' . $mysqli->error;
     
                    return false;
            }
            else {
     
                while($row = $result->fetch_array()) {
     
                    $menu_data[] = $row;
                }
     
                if(isset($menu_data)) {
     
                    return $menu_data;
                }
                else {
     
                    return false;
                }
            }
     
            $mysqli->close();
        }
     
        function checkUserPermission($user_role_id, $action_slug) {
     
            $mysqli = new mysqli('localhost', 'root', '', 'projet_image');
            $mysqli->set_charset("utf8");
     
            if($mysqli->connect_errno) {
     
                printf("Echec de la connexion: %s\n", $mysqli->connect_error);
     
                exit();
            }
     
            $sql = 'SELECT P.actionID, P.roleID
                    FROM user_permission AS P
                    INNER JOIN user_action AS A
                    ON(A.slug = "' . $action_slug . '"
                    AND P.actionID = A.actionID)';
     
            $result = $mysqli->query($sql);
     
            if(!$result) {
     
                echo 'Une erreur est survenue lors de la récupération des données 
                      dans la base. Message d\'erreur : ' . $mysqli->error;
     
                return false;
            }
            else {
     
                while($row = $result->fetch_array()) {
     
                    if($row['P.roleID'] > $user_role_id) {
     
                        return false;
                    }
                    else {
     
                        return true;
                    }
                }
            }
     
            $mysqli->close();
        }
    }
    process/process-display-menu.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    $roleID = isset($_SESSION['r.roleID']) ? $_SESSION['r.roleID'] : NULL;
     
    $user = new Users();
    $menu_items = $user->displayMenu($roleID);
     
    var_dump($menu_items);
    $menu_html = '';
     
    if(!empty($menu_items)) {
     
        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";
        }
    }
    process/process-user-permission.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    require('../class/Users.php');
     
    $action_slug = substr($filename, 0, 4);
     
    $level = isset($_SESSION['level']) ? $_SESSION['level'] : NULL;
     
    $user = new Users();
    $userPermission = $user->checkUserPermission($action_slug, $level);
     
    if($userPermission === false) {
     
        echo 'Erreur. Cette page n\'existe pas.';
     
        exit;
    }
    admin/menu.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?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>
    admin/index.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    require('../include/inc-config.php');
     
    $filename = basename( __FILE__ );
    require('../process/process-user-permission.php');
     
    require('menu.php');

  2. #2
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    j'ai regardé rapidement ton code.

    Déjà, tu montres la structure dans PHPMYADMIN de 3 tables, sans les nommer ; à nous de deviner...De plus, à moins d'avoir lu trop vite ton code, seules les 2 premières sont utilisées.

    Autre remarque : tu dupliques la connexion : méthodes displayMenu et checkUserPermission de la classe Users. Il faudrait la factoriser, le mieux étant de créer une classe mère connection dont hériterait la classe Users.

  3. #3
    Membre averti
    Homme Profil pro
    Dépanneur informatique
    Inscrit en
    Septembre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Dépanneur informatique

    Informations forums :
    Inscription : Septembre 2021
    Messages : 31
    Par défaut
    Bonjour, j'ai laissé tomber la classe mysqli pour PDO. Message d'erreurs sur la page admin/index.php =>
    Notice: Trying to access array offset on value of type bool in C:\wamp64\www\projet-images-en-poo-et-pdo\class\userManager.php on line 310
    & le var_dump($menu_items) =>
    C:\wamp64\www\projet-images-en-poo-et-pdo\process\process-display-menu.php:9:boolean false
    Table user

    Nom : table user.PNG
Affichages : 220
Taille : 38,7 Ko

    Table user_action

    Nom : table user_action.PNG
Affichages : 229
Taille : 30,8 Ko

    Table user_permission

    Nom : table user_permission.PNG
Affichages : 234
Taille : 26,1 Ko

    Table user_role

    Nom : table user_role.PNG
Affichages : 234
Taille : 18,0 Ko

    class/userManager.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    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.actionID
                        INNER JOIN user_role AS r
                        ON P.actionID = R.level
                        INNER JOIN user AS U
                        ON R.roleID = U.role_id  
                        AND P.actionID < :user_role_id';
     
                $stmnt = $this->db->prepare($sql);
                $stmnt->bindParam(':user_role_id', $user_role_id);
                $stmnt->execute();
     
                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.<br>
                Message d\'erreur : ' . $e->getMessage();
            }
        }
     
        public function checkUserPermission($action_slug, $user_role_id) {
     
            try {
     
                $sql = 'SELECT P.actionID, P.roleID
                        FROM user_permission AS P
                        INNER JOIN user_action AS A
                        ON A.slug = :action_slug
                        AND P.actionID = A.actionID';
     
     
                $stmnt = $this->db->prepare($sql);
                $stmnt->execute(array(
     
                    ':action_slug' => $action_slug
                ));
     
                $row = $stmnt->fetch();
     
                if($row['P.roleID'] > $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.<br>
                Message d\'erreur : ' . $e->getMessage();
            }
        }
    }
    process/process-display-menu.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $level = isset($_SESSION['level']) ? $_SESSION['level'] : NULL;
     
    $manager = new userManager($db);
    $menu_items = $manager->displayMenu($level);
     
    var_dump($menu_items);
    $menu_html = '';
     
    if(!empty($menu_items)) {
     
        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";
        }
    }
    process/process-user-permission.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $action_slug = substr($filename, 0, 4);
     
    $level = isset($_SESSION['level']) ? $_SESSION['level'] : NULL;
     
    $manager = new userManager($db);
    $userPermission = $manager->checkUserPermission($action_slug, $level);
     
    if($userPermission === false) {
     
        echo 'Erreur. Cette page n\'existe pas.';
     
        exit;
    }
    admin/menu.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?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>
    admin/index.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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');

  4. #4
    Membre averti
    Homme Profil pro
    Dépanneur informatique
    Inscrit en
    Septembre 2021
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Dépanneur informatique

    Informations forums :
    Inscription : Septembre 2021
    Messages : 31
    Par défaut
    Bonjour, j'ai enfin mon menu qui s'affiche avec les liens vers les pages.

    Par contre, que çà soit n'importe quelle session Administration, Editeur, ou autre

    J'ai tout qui s'affiche.

    Voici mon code modifié :

    class/userManager.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    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
                        INNER JOIN user_role AS R
                        ON P.role_id = R.level
                        INNER JOIN user AS U
                        ON R.roleID = U.role_id
                        AND R.level >= :user_role_id';
     
                $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.<br>
                Message d\'erreur : ' . $e->getMessage();
            }
        }
     
        public function checkUserPermission($action_slug, $user_role_id) {
     
            try {
     
                $sql = 'SELECT P.action_id, P.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)) {
     
                    if($row['P.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.<br>
                Message d\'erreur : ' . $e->getMessage();
            }
        }
    }
    process/process-display-menu.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    $username_form = isset($_SESSION['username_form']) ? $_SESSION['username_form'] : NULL;
     
    var_dump($username_form);
     
    $manager = new userManager($db);
    $menu_items = $manager->displayMenu($username_form);
     
    var_dump($menu_items);
    $menu_html = '';
     
    if(!empty($menu_items)) {
     
        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";
        }
    }
    process/process-user-permission.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $action_slug = substr($filename, 0, 4);
     
    $username_form = isset($_SESSION['username_form']) ? $_SESSION['username_form'] : NULL;
     
    $manager = new userManager($db);
    $userPermission = $manager->checkUserPermission($action_slug, $username_form);
     
    if($userPermission === false) {
     
        echo 'Erreur. Cette page n\'existe pas.';
     
        exit;
    }
    include/inc-identification-user.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    require('../class/userManager.php');
     
    session_start();  
     
    if(!isset($_SESSION['username_form'])) {
     
    	echo 'Vous n\'avez pas les droits d\'accès à cette page'; 
        echo '<br><a href="../index.php">retour vers le site</a>'; 
     
        exit;
    } 
     
    $username_form = $_SESSION['username_form'];
     
    $manager = new userManager($db);
    $user = $manager->getUserData($username_form);
     
    if(!isset($user)) {
     
    	echo 'Vous n\'avez pas les droits d\'accès à cette page'; 
        echo '<br><a href="../index.php">retour vers le site</a>'; 
     
        exit;
    }
    admin/menu.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?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>
    admin/index.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    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');

Discussions similaires

  1. [Zope] Sécurité, rôles et permissions
    Par senacle dans le forum Zope
    Réponses: 8
    Dernier message: 29/09/2006, 13h33
  2. Atteindre un espace mémoire avec perl
    Par scaleo dans le forum Langage
    Réponses: 3
    Dernier message: 31/03/2006, 18h53
  3. [Sécurité] sécurité admin avec PHP
    Par carter15_2001 dans le forum Langage
    Réponses: 3
    Dernier message: 04/01/2006, 02h04
  4. comment faire un espace privé....avec confirmation par mail
    Par brisso dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 30/11/2005, 10h24
  5. espace admin
    Par cyrill.gremaud dans le forum ASP
    Réponses: 3
    Dernier message: 13/09/2005, 19h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo