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 :

Gestion accès pages à certains utilisateurs [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut Gestion accès pages à certains utilisateurs
    Bonjour,

    Dans le site que je développe, une partie de l'admin va être accessible à certains gestionnaires.

    Je désire donc limiter l'accès à certaines pages et/ou certaines actions en fonctions des droits que j'octrois.

    Mais certaines actions/pages seront accessibles à plusieurs niveaux

    Voici une ligne de ma table user (avec les champs qui m'intéressent pour le post) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id | mail              | level    | active
    -----------------------------------------
    10| mail1@mail.com     | 0,1,2,11 | 1
    14|mail2@mail.com      | 0,1,3,11 | 1
    J'ai pensé travailler ma requete avec STRIPOS mais cela ne fonctionne pas car si je cherche 11 et 1 dans les 2 cas le 1 sort en résultat.

    Est-ce que je m'y prends correctement au niveau de ma structure ou pouvez vous me donner un conseil?

    Merci d'avance,
    David

  2. #2
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Points : 238
    Points
    238
    Par défaut
    Bonjour,

    je suppose que dans le tout début de ta page tu fais un test d'accéssisibilité qui devrais rassembler à :

    maitnenant quand ton utiisateur se connecte je suppose que tu récupère son champ level :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $user_level=$row['level'];
    puisque le level de ton utilisateur est une variable contenant des valeurs séparés par virgule, tu pourras faire un explode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $user_level=$row['level'];
    $levels = explode(",", $user_level);
    for ($i=0;$i<count($levels);$i++){
    $user_levels[]=$levels [$i];
    }
    après tu vérifies si ton niveau d'accès de la page en cours est dans le tableau user_levels

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Points : 98
    Points
    98
    Par défaut
    En effet, tu dois faire ta vérification en début de page. Vu le type d'architecture choisie pour la BDD, la solution de mandrake serait la plus adaptée.

    Une petite optimisation de son code cependant :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $user_lvls = explode(",",$row['level']); // Mettra tous les lvls dans le tableau $user_lvls
    if(!in_array(1, $user_lvls)) // Si l'utilisateur n'a pas accès à la page (admettons que la page soit de niveau "1"){
        // Traiter l'erreur d'accès ici...
    }

  4. #4
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci pour vos réponses.

    J'ai fait comme ceci (voir bas) mais un probleme persiste:

    J'ai un menu commun à tous ceux qui peuvent accéder à l'admin. Mais comme je limite les pages, je dois aussi cacher les liens des menus en fonction des droits.
    J'ai essayé de faire une requète avec un in_array mais cela ne va pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $sql_check_get = make_select('*', 'menu', "m_url_rewrite='".$_GET['section']."' 
                                         AND m_lang='".$_SESSION['lang_back']."'", 'm_active=1');
    $data_check_get = $sql_check_get -> num_rows;
    $row_check_get = $sql_check_get -> fetch_object();
    $user_level = $row_check_get -> m_level;
    $levels = explode(",", $user_level);
    if($data_check_get == 1 && file_exists('views/'.$row_check_get -> m_get.'.php') && in_array($_SESSION['level'],$levels)){
        include 'tools/menu.php';
        include 'views/'.$row_check_get -> m_get.'.php';
    }else{
        header('Location:'.$address_back.'stats-website');
    }
    Merci d'avance de vos réponse.

    David

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Points : 98
    Points
    98
    Par défaut
    Salut,

    Il y a quoi dans ? Le level de la page ?

    Petites idées pour t'aider à débugger ton code (si tu n'as pas xdebug installer) :
    - Faire des echo de tes variables
    - Fair des var_dump().

    Le second t'affiche la variable et son type (pratique pour tester des conditions, comme par exemple
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    in_array($_SESSION['level'], $levels)
    .
    De ce que j'ai compris, tu inclus le menu (commun à tous) puis une vue dépendant d'un URL rewriting. Si tel est le cas, ta vérification des liens doit se faire dans le fichier menu.php ==> Pour les liens que tu veux "limiter", tu vérifies que les droits de l'utilisateur correspondent bien au droit de la page sur laquelle pointe le menu.

    Le mieux pour ne pas avoir à passer sur toutes les pages est alors de stocker les droits de l'utilisateur en variable de session pour éviter d'avoir à repasser sur toutes les pages. Exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['lvl_user'] = explode(",", $row['lvl']);

    Sur ton fichier menu.php, tu as alors plus qu'à faire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(in_array(3, $_SESSION['lvl_user']))
        echo 'lien_vers_page_ou_seuls_les_user_ayant_le_lvl_3_peuvent_acceder.php';

  6. #6
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Merci de votre réponse.

    Je réponds aux vôtres:

    Voici la strucure:

    id | mail              | level    | active
    -----------------------------------------
    10 | mail1@mail.com    |   1,2,11 | 1
    14 |mail2@mail.com     | 0,1,3,11 | 1
    Il y a quoi dans ?
    Lorsque l'utilisateur se connecte, je teste viq une requete son niveau d'accès et ensuite je mets son niveau en session tout au long de sa visite.
    Petites idées pour t'aider à débugger ton code (si tu n'as pas xdebug installer) :
    Je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if($debug == 1){
        echo("<pre style=\"font-size:14px;float:left\">") ;
        print_r($_POST) ;
        print_r($_GET);
        print_r($_SESSION) ;
        print_r($_FILES) ;
        echo("</pre>\n") ;  
    }
    Ce que je désire, étant donné que j'ai un menu commun à tous les utilisateurs, c'est d'afficher seulement les menus disponibles en fonction des niveaux de chacuns. Et c'est là où je bloque. Est-ce-que la colonne LEVEL pose problème? J'ai essayé une requête avec un IN comme ci-dessous mais il ne prend pas en considération la valeur de mon array:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_menu = make_select('*', 'menu', "m_level IN (".$_SESSION['level'].")", "m_visible_menu=1 AND m_lang='".$_SESSION['lang_back']."'", 'm_order ASC', null);
    Ce qui me fait dans mon cas en full admin:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM menu WHERE m_level IN (0) AND m_visible_menu=1 AND m_lang='en' ORDER BY m_order ASC
    Donc en fait, il ne m'affiche que les menu strictement égal à zéro. Hors j'aimerai qu'il cherche une chaine 0 dans la chaine 0,1,2,3,4. Et le in_array de php de fonctionne pas dans ma requete...
    Merci d'avance de votre aide,
    David

  7. #7
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Points : 144
    Points
    144
    Par défaut
    Je me réponds car j'ai trouvé la solution. Je laisse ce que j'ai trouvé et merci à ceux qui m'on aidé.

    Il faut utiliser FIND_IN_SET .C'est le in_array de Myslql

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM menu WHERE FIND_IN_SET ($_SESSION['level'],m_level) AND m_visible_menu=1 AND m_lang='en' ORDER BY m_order ASC

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion accès page JSF
    Par fabaud dans le forum JSF
    Réponses: 6
    Dernier message: 03/12/2013, 08h27
  2. Bloquer accès Internet à certains utilisateurs locaux
    Par papal02 dans le forum Windows XP
    Réponses: 2
    Dernier message: 04/01/2008, 15h28
  3. Accès à certains dossiers pour certains utilisateurs
    Par jacksay dans le forum Administration système
    Réponses: 1
    Dernier message: 12/01/2007, 11h46
  4. Gestion accès au fichier par utilisateur
    Par Invité dans le forum Langage
    Réponses: 11
    Dernier message: 18/04/2006, 12h26
  5. Réponses: 10
    Dernier message: 23/11/2004, 18h14

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