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 des droits d'accès sur admin


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 143
    Points : 52
    Points
    52
    Par défaut Gestion des droits d'accès sur admin
    Bonjour,

    J'aimerai modérer l'accès des fonctionnalités de mon site à mes utilisateurs.
    Dans l'idée j'ai une table tb_fonctionalite avec 2 champs id et nom
    Dans ma gestion des utilisateurs je pensai lister les entrées de cette table sous forme de checkbox avec comme valeur l'ID et au final je concatène les valeur récupéré pour renseigner mon champ privilège dans la table utilisateur.
    Je donne un exemple:
    tb_fonctionalite
    id:1 nom:photos
    id:2 nom:texte
    id:3 nom:pdf

    Je souhaite que mon utilisateur DUPONT accède à la modification des photos et des pdf donc je coche mes 2 checkbox ce qui me donnera dans ma table utilisateur le champ privilège:1-3

    Par la suite quand l'utilisateur se Log il aura un menu constitué que des fonctionnalités qui lui sont autorisés. Ceci grâce à la relation entre l'id des fonctionnalités et les numéro récupérés dans le champ privilège.
    (Petite précision ma table fonctionnalité est évolutive je souhaite par la suite rajouter des champs)

    Ce n'est pas très facile a expliquer...
    J'aimerai connaitre votre avis sur ma solution pour modéré l'accès au fonctionnalités du site. (s'il y a des méthode beaucoup plus simple ou autres...)

    Merci d'avance

  2. #2
    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,

    Tu te situes dans un cas typique de relation N-N : un utilisateur peut avoir plusieurs fonctionnalités (img, pdf, ..) et chaque fonctionnalité peut être utilisée par plusieurs utilisateurs.

    Dans ces cas, il convient mieux de faire une table intermédiaire, qui est beaucoup plus évolutif et "sain" qu'une liste d'id dans un champ de table. Je sais de quoi je parle, j'en ai fait les frais à mes débuts !

    En gros, mettre une liste d'id t'oblige à avoir du champ texte. Si un jour tu veux faire une évolution de droits ou lister tous les utilisateurs ayant tel type de droit, tu seras obligé de requêter sur un champ texte, ce qui est loin d'être optimisé.

    L'idée est d'avoir :
    table utilisateur (id, nom, ...)
    table fonctionnalité (id, nom_fonctionnalité, ...)
    table utilisateur_fonctionnalité(id_utilisateur, id_fonctionnalité)

    La troisième table te permettra de faire la liaison entre une table utilisateur et fonctionnalité.

    Pour les récupérer, une simple jointure suffira.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Merci pour votre aide,
    Je suis donc parti sur cette idée de table intermédiaire.(qui m'a l'air bien plus astucieuse que mon idée)
    Par contre maintenant je suis un peu bloqué sur la requête de jointure...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT tb_fonction.id_fonction, tb_fonction.nom_fonction
         FROM
    	 tb_fonction
         INNER JOIN tb_utilisateur_fonction ON tb_fonction.id_fonction = tb_utilisateur_fonction.id_utilisateur
         WHERE tb_utilisateur_fonction.id_utilisateur = $utilisateur

  4. #4
    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
    Si tu veux récupérer uniquement les fonctions (tu as déjà la donnée utilisateur), tu as une petite erreur dans ta condition de jointure :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN tb_utilisateur_fonction ON tb_fonction.id_fonction = tb_utilisateur_fonction.id_fonction

    Tu peux également récupérer toutes les données simultanément (pour éviter de faire deux requêtes), mais pour ça il faut faire deux jointures :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT tb_fonction.id_fonction, tb_fonction.nom_fonction
         FROM tb_fonction
         INNER JOIN tb_utilisateur_fonction ON tb_fonction.id_fonction = tb_utilisateur_fonction.id_fonction
         INNER JOIN tb_utilisateur ON tb_utilisateur_fonction.id_utilisateur = tb_utilisateur.id_utilisateur
         WHERE tb_utilisateur.id_utilisateur = $utilisateur

    Le "where" peut être changé en fonction de tes besoins. Tu peux même directement récupérer des données présentes en variables de session (si tu les utilise).

    Pour info, et pour avoir moins de code a écrire dans ta requête, tu peux "renommer" tes tables lors de ta requête, le résultat sera le même :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT f.id_fonction, f.nom_fonction
         FROM tb_fonction f
         INNER JOIN tb_utilisateur_fonction uf ON f.id_fonction = uf.id_fonction
         INNER JOIN tb_utilisateur u ON uf.id_utilisateur = u.id_utilisateur
         WHERE u.id_utilisateur = $utilisateur

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup,
    ça marche parfaitement.

    je ne sais pas si c'est possible a faire mais j'aimerai savoir si dans la clause WHERE je peux mettre le nom de l'utilisateur directement afin de faire qu'une requête car je n'ai pas id_utilisateur mais nom_utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE tb_utilisateur.nom_utilisateur = 1
    sinon je fais une autre requête en amont afin de déterminer id_utilisateur ça je sais faire.

Discussions similaires

  1. [AC-2003] Problème sur gestion des droits d'accès
    Par alu1308 dans le forum Sécurité
    Réponses: 1
    Dernier message: 01/08/2013, 18h47
  2. Gestion des droits d'accès sur Access 2003
    Par cotmar dans le forum Access
    Réponses: 2
    Dernier message: 04/05/2006, 16h41
  3. gestion des droits d'accès : pg_hda.conf et autres
    Par Pigoulou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 12/02/2005, 07h57
  4. Gestion des droits d'accès
    Par soulryo dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 12/01/2005, 10h50

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