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 :

Réflexion sur un système de gestions de droits avancés


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut Réflexion sur un système de gestions de droits avancés
    Hello,

    Voilà mon idée : Pour un site qui devra gérer un très grand nombre d'utilisateur, je souhaite mettre en place un système de groupes d'utilisateurs permettant ou non l'accès à divers modules de mon site.

    Concrètement, je veux pouvoir dire que le module "Gestion des utilisateurs" doit être accessible au groupe "Modérateurs", groupe composé par exemple de Charles, Jean et Marc. Je veux pouvoir à volonté créer d'autres groupes, pouvoir placer chaque utilisateur de mon choix dans les groupes que je veux et définir quel groupe a accès à tel module.

    Pour les droits pure, il n'est pas question de jouer avec quelquechose du style RWX, on se contente simplement de rattacher un groupe à un module, si le lien existe, alors le groupe a accès au module, sinon, pas d'accès. Bien entendu, un utilisateur peut appartenir à plusieurs groupes

    Well, j'y réfléchis donc depuis plusieurs jours, et j'avoue bloquer un peu..

    voilà où j'en suis, d'un point de vue Mysql :

    tbl_users
    Commentaires sur la table: Table user, password, date de création et lien vers profile_

    Champ Type Null Défaut Commentaires
    user_id int(6) Oui NULL
    user_login varchar(30) Oui NULL
    user_password varchar(20) Oui NULL
    user_creation_date datetime Oui NULL
    user_modification_date datetime Oui NULL
    user_desactivation_date datetime Oui NULL
    user_mail varchar(60) Oui NULL
    user_validation_code varchar(32) Oui NULL
    user_activation int(1) Oui NULL
    user_mod_id int(2) Oui NULL
    user_nbr_consultations int(6) Oui NULL
    Une table utilisateurs, tout ce qu'il y a de plus standard. Vous noterez qu'aucune référence au groupe n'existe.

    tbl_groupes
    Commentaires sur la table: Creation / suppression des groupes d'utilisateurs

    Champ Type Null Défaut Commentaires
    groupe_id int(2) Oui NULL
    groupe_name varchar(20) Oui NULL
    groupe_commentaire varchar(300) Oui NULL
    Dans cette table, on ne fait que lister les groupes qui existent. Le contenu de cette table est appelé lorsque l'on veut lister les groupes existant.

    tbl_users_to_groupes
    Commentaires sur la table: Table de rangement des users dans les groupes

    Champ Type Null Défaut Commentaires
    user_to_groupe_id int(8) Oui NULL
    LIEN_user_id int(6) Oui NULL
    LIEN_groupe_id int(2) Oui NULL
    user_to_groupe_creationdate datetime Oui NULL
    Après avoir listé nos groupes (voire table avant), on note ici quel user appartient à quel groupe. Je voulais partir avec des clefs étrangères, une qui renvoi vers l'user_id et l'autre le groupe_id correspondant. Ici, on sait que Charles appartient au groupe Modérateur.

    tbl_modules
    Commentaires sur la table: correspondance entre l'adresse des scripts et les liens

    Champ Type Null Défaut Commentaires
    module_id int(2) Oui NULL
    module_name varchar(30) Oui NULL
    module_lien varchar(50) Oui NULL
    module_commentaire varchar(50) Oui NULL
    Ici, on déclare chaque module qui composera notre site. Je ne sais pas exactement comment je vais organiser ça, dans le principe, ça doit ressembler à ça.

    tbl_modules_droits
    Commentaires sur la table: quel groupe a le droit d'accéder à quoi

    Champ Type Null Défaut Commentaires
    module_droit_id int(3) Oui NULL
    LIEN_module_droit_groupe_id int(2) Oui NULL
    LIEN_module_droit_module_id int(2) Oui NULL
    Celle là, c'est ma préférée.. On dit quel groupe a accès à quel module. Si la relation n'existe pas, le groupe n'a pas accès au module, point.

    Toutes les tables sont en MyISAM, mais vu que nous sommes amenés à utiliser des clefs étrangères, il faut bien entendu modifier le moteur pour les tables qui en contiennent.

    D'un point de vue PHP/SQL, au chargement d'une page, je voyais un bout de code qui allait d'abord lister tous les groupes ayant accès à ce module, ensuite une requête vérifiant que mon utilisateur (user_id en session) fait bien parti de l'un de ces groupes, si oui, je charge la page, sinon, bybye (si non, en fait le lien n'apparaitrait même pas).

    Je n'ai pas été plus loin.

    Je voudrais votre avis sur ce système, comment l'optimiser au niveau MySQL, quels sont vos conseils, comment auriez vous fait pour arriver au même point ? Voyez vous une autre solution plus simple pour en arriver au même résultat ?

    Tout en gardant à l'esprit que j'aurai plein d'user à gérer. A noter aussi qu'on peut se passer de mettre un utilisateur dans plusieurs groupes, on peut simplement créer un groupe avec les droits précis que l'on veut et y coller notre user, de cette façon, on a un user par groupe et peut-être que c'est plus simple à gérer ? A voire.. J'attends vos avis, n'hésitez pas à poster vos exemples

    merci !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    D'un point de vue PHP/SQL, au chargement d'une page, je voyais un bout de code qui allait d'abord lister tous les groupes ayant accès à ce module, ensuite une requête vérifiant que mon utilisateur (user_id en session) fait bien parti de l'un de ces groupes
    Tu peux tout faire en une seule requête en joignant les 3 tables.

    Toutes les tables sont en MyISAM, mais vu que nous sommes amenés à utiliser des clefs étrangères, il faut bien entendu modifier le moteur pour les tables qui en contiennent.
    Ce n'est pas une necessité. Innodb ne permet que de mettre des contraintes sur ce qui est déjà une clef étrangère.

    Pour ta réflexion :
    - est-ce que certain module sont accessibles sans authentification ?
    - pour manipuler un grand nombre de personnes, n'aurais-tu pas besoin de profils ? ou groupe de groupes ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu peux tout faire en une seule requête en joignant les 3 tables.
    Ah bon ? Pourrais-tu me donner un exemple ? En partant de ces tables.

    Citation Envoyé par sabotage Voir le message
    Pour ta réflexion :
    - est-ce que certain module sont accessibles sans authentification ?
    - pour manipuler un grand nombre de personnes, n'aurais-tu pas besoin de profils ? ou groupe de groupes ?
    justement, je pense que non. En fait, le site ne sera accessible qu'aux personnes authentifiées. Donc l'utilisateur de base aurait un accès standard, comme sur les autres sites, l'utilisateur VIP aurait un peu plus de trucs et après on aurait les modérateurs, les administrateurs et après les comptes spéciaux avec des droits d'accès particuliers.

    Présentement, je ne vois pas trop où je dois mettre des clefs étrangères et si mon système basé sur la table tbl_modules_droits est utilisable (et si oui, comment..)

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca donnerait ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*) FROM
    tbl_modules_droits JOIN tbl_users_to_groupes ON LIEN_module_droit_groupe_id = LIEN_groupe_id
    WHERE LIEN_module_droit_module_id = $id_du_module
    AND LIEN_user_id = $id_utilisateur

    Pour les clefs étrangères, tu les as déjà, même si elles sont pas définies par le moteur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut
    mmh, merci

    et sinon globalement, que pensez vous de ce système de gestion de droits ? Peut-on faire plus simple et tout aussi efficace ? D'autres idées ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 67
    Points : 31
    Points
    31
    Par défaut
    Mh, je me permets de vous relancer..

    Croyez vous que ce système de droit tien bien la route ? Auriez vous quelque chose de plus simple à mettre en place et tout aussi efficace ?

    De mon point de vue, j'aime bien pouvoir tout gérer depuis la base de donnée. Avant, pour chaque script qui je mettait en place, à l'intérieur du script, je mettais un contrôle en dur du groupe de l'utilisateur : admin, modérateur, utilisateur.. Et ceci pour chaque script ayant besoin d'un niveau d'accès.

    Là ce contrôle se fait directement depuis la base de donnée et je peux moduler à souhait mes accès.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Si cela peut aider voici comment je gère cela de mon coté :

    Une table utilisateur , classique
    Une table groupe , tout aussi classique
    Une table droit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    id (int)
    nom (varchar)
    cle (varchar)
    Cette table contient tous les droits dont j'ai besoin, par exemple :
    1,Accès à l'administration, acces_admin

    A celà s'ajoute deux autres tables , droit_user et droit_groupe
    Qui font la relation entre la table droit et les table user ou groupe.

    Tout comme toi si la relation existe, l'utilisateur est autorisé sur le droit sinon , on lui refuse l'accès.

    Au niveau utilisation dans mes pages qui nécessite un droit quelconque j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if($auth->isAllowed('cle_du_droit')
    {
        //Action protéger par un droit
    }
    else
    {
        //Pas autorisé => redirection , information ...
    }
    Il suffit ensuite de défnir quel groupe à quel droit , idem pour les utilisateur.

    Cette méthode me permet une gestion plutôt fine des droits car un utilisateur hérite évidemment des droits de son groupe mais peut également avoir des droits supplémentaire via la table droit_user.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Système de gestion de droits utilisateurs
    Par krachik dans le forum Langage
    Réponses: 10
    Dernier message: 31/07/2010, 21h15
  2. [MySQL] Système de gestion de droits complexe
    Par van___fanel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/02/2010, 15h45
  3. Avis des développeurs sur un système de gestion.
    Par snoopy69 dans le forum Access
    Réponses: 7
    Dernier message: 19/05/2006, 15h47

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