Design patterns, securité & droits d'accès

Discussion dans 'Web, design' créé par Ahava, 4 Mars 2007.

Statut de la discussion:
Fermée.
  1. Offline
    Ahava Revenant
    Bonjour,

    Je suis au stade de l'analyse pour un projet de site web (sous le design pattern de DAO)

    Je voudrais savoir comment implémenter au mieux la notion de "rangs" dans ce site web, (un rang = un type d'acteurs ex : membres, admin, modo's, etc.), et la notion de droits d'utilisateurs.

    A part mettre une valeur entiere pour chaque rang, je ne connais aucun autre systeme...

    Et encore plus important, comment bien implémenter la notion de droits d'utilisateurs, de sorte à que ce soit dynamique bien évidemment, mais que l'on puisse le plus aisément possible ajouter un module plus tard, et ajouter la possibilité de rajouter ds droits sur ce module, toujours le plus aisément possible et toujours dynamiquement ?

    En somme, que connaissez vous comme méthode d'approche pour cela, qu'est ce qui se fait et qu'est ce qui est le mieux ? :)


    (j'espere avoir été clair, sinon je tenterai de rééxpliquer :oops:)


    merci pour votre temps :)
    Ahava, 4 Mars 2007
    #1
  2. Offline
    k o D Belge !
    Yop.

    Alors si j'ai bien compris ta demande, tu désires mettre en place un système d'accès avec différents droits en fonction du "grade" de la personne.

    Bon et bien si c'est pour un site web, voici ce que je te conseille de faire:

    Comme tu l'as indiqué, dans ta table membre, un champ qui définit un "rang" à cette personne.
    Ce champ "rang" contient une FK vers une autre table nommée justement "rang".

    De cette manière, tu pourras rajouter des rangs comme tu le désires par la suite (Attention la suppression totale d'un rang posera problème si justement des membres ont son rang)

    Ensuite, tu crées une table qui définit pour chaque rang ses niveaux d'accès par exemple:
    "Ajout news" est mis à true si les personnes du rang "1" peuvent ajouter une news.

    J'espère avoir cerné ton problème :p
    k o D, 4 Mars 2007
    #2
  3. Offline
    Froggy fake geek
    pour ce qui est de la suppression de rang il "suffit" de faire en sorte qu'en supprimant un rang tu passes en revue tout les membres et ceux qui ont ce rangsont rétrogradé (par exemple) ;)

    bon pour un site avec 30.000 membre (gamerz ? :-D ) c'est pas super optimisé mais ça m'étonnerai que tu bosses sur un site du style ;)
    Froggy, 4 Mars 2007
    #3
  4. Offline
    k o D Belge !
    Oui effectivement il peut le faire ainsi mais bon voilà dans pas mal de cas c'est ennuyeux. A lui de voir si çà dérange ou pas ;)
    k o D, 4 Mars 2007
    #4
  5. Offline
    Ezekiel ! Elite
    Moi je fonctionne avec un champ int dans ma table membre ainsi qu'une autre table "module" qui liste tout mes modules avec leur nom & le grade nécessaire pour y accéder.
    Ensuite j'ai un ptit script qui vérifie si la page est du type ges_MODULE, add_MODULE, mod_MODULE et qui vérifie le grade du membre en fonction du MODULE.
    Ezekiel !, 4 Mars 2007
    #5
  6. Offline
    Ahava Revenant
    Merci KoD, c'est ce qu'il me fallait :)


    Une table rangs contenant le nom du rang & un id,


    et chaque rang aura un et un seul tuple dans une autre table, "acces_rangs" ayant un champ par module du site ! Très bien ça, j'aime !



    merci :p
    Ahava, 6 Mars 2007
    #6
  7. Offline
    k o D Belge !
    De rien :)
    k o D, 6 Mars 2007
    #7
  8. Offline
    Ahava Revenant
    Comment intégrer à ceci :

    Un member peut avoir plusieurs rangs, càd (etudiant + gestionnaire wiki ) etc. ?

    Ah j'imagine qu'en fait, la notion de rang est la meme que "groupe", et ainsi je peux dire qu'un membre voulant avoir plusieurs modules différents fait partie d'un rang spécial, une sorte de "groupe" à lui tout seul ?
    Ahava, 6 Mars 2007
    #8
  9. Offline
    [n]00bie L'homme qui post jamais
    relation m à n entre ta table des users et ta table des rangs...Donc tu tape une table intermédiaire qui permet à un user d'avoir plusieurs rangs d'accès. En même temps j'y connais rien en gestion de droits et autre mais ca me semble logique comme ca :p
    [n]00bie, 6 Mars 2007
    #9
  10. Offline
    Froggy fake geek
    sinon tu peux aussi considérer qu'un rang est groupe de module et donc pour chaque utilisateurs tu mets autant de champs (booléen) qu'il y a de "grade" pour savoir s'il a accès a tel ou tel groupe de module.
    Froggy, 6 Mars 2007
    #10
  11. Offline
    xe0n Chamois d'or
    je ne te conseille pas ta solution, car ca va vite devenir pénible, tu vas commencer a avoir plein de groupes ...

    si j'ai bien compris la solution de kod, il suffit de rajouter une table intermédiaire entre personne et rang

    une sorte de liaison n à n au niveau conceptuel qui entraine une table intermédiaire au niveau relationnel

    personne - possede - rang




    maintenant a toi de voir comment tu comptes gérer cela au niveau du multi rôle (ca doit pas être chinois à implémenter)

    Edit : qqun a répondu plus vite que moi :)
    xe0n, 6 Mars 2007
    #11
  12. Offline
    xe0n Chamois d'or
    je pense pas que ce soit terrible si le programme doit etre facilement administrable (ajouter des rangs entrainera une modification du code)
    xe0n, 6 Mars 2007
    #12
  13. Offline
    AcidBird Touriste
    j'ai lu en diagonale ... mais je pense que ce qu'il te faut c'est le modèle suivant : un utilisateur devrait avoir un rang/Grade/ Statut

    Tu définit ce statut comme une succesion d'autorisation. Comme ça, tu peux modifier un statut sans changer ton code (il suffit de vérifier si le statut a le droit à tel opération) ... Tant que tu n'ajoutes pas de nouvelle fonction et que tu planifies bien les autorisations, tu n'a pas a changer ton code.

    Table Status : StatusId, Status Name
    Table Person : .... StatusId (FK)
    Table Autorisation IdAutorisation, AutorisationName
    Table StatusDefinition : IdStatus, IdAutorisation
    AcidBird, 6 Mars 2007
    #13
  14. Offline
    Ahava Revenant
    Oui, il faut SURTOUT pas avoir à changer le code, tout en changeant toutes les autorisations du site. C'est ça le but, n'avoir pas à toucher une ligne de code pour laisser l'accès à un module du site, (juste vue du module, ou administration du module).

    J'ai pas bien compris ce que tu veux dire par statut acidbird...
    Ahava, 6 Mars 2007
    #14
  15. Offline
    AcidBird Touriste
    Ben en gros, chaque user est lié a un statut (ou un groupe si tu préfère :)). le code de ton object status ne changera jamais, ce sera un truc du style

    Class Status
    ...
    private
    Collection<Autorisation> autorisations
    public boolean hasRight(Autorisation aut) {
    return autorisations.contains(aut)
    }


    Après, pour chaque Action possible sur ton site, tu crée un object qui le gére et tu lui met comme propriété une autorisation

    Class PostNews
    private
    Autorisation requiredAutorisation = new Autorisation (x, autname)
    Procedure Object notAllowed
    ...
    public
    ...
    procedure Object process(HTTPRequest req) {
    // fetch le current user de ta request
    if ! currentuser.getStatus.hasRight(requiredAutorisation)
    return NotAllowed
    else
    ....
    }


    Quand tu reçoit un nouvelle requête, il suffit d'appliquer ce modèle et ton code ne devrait jamais changer pour gérer les accès. Tout ce que tu as a faire, c'est à chaque nouvelle fonctionalité, créer une autorisation correspondante dans la Db et ton object qui gére le process. Il suffit de penser à appeler le hasRight de ton utilisateur courant avant de répondre à sa requête.

    Il te suffit donc de lier, dans ta DB, un Statut (groupe) à chaque autorisation que tu veux lui donner

    PS : ne pas oublier de coder une méthode equals pour Autorisation sinon le collection.contains ne marchera pas ;)
    AcidBird, 6 Mars 2007
    #15
  16. Offline
    k o D Belge !
    Si tu veux plusieurs permissions possibles pour une personne implémente celà de cette manière:

    [IMG]

    (Note que les traits sont incorrects c'est bien une relation m à n entre la table membres et permissions grâce à lignesPermission)
    k o D, 6 Mars 2007
    #16
  17. Offline
    Ahava Revenant
    ah oué oké ! Je vais utiliser ca je crois, comme ca c'est ultra souple : un membre peut avoir plusieurs "rangs".

    Fin je vais voir alors, comment choisir alors lequel des rangs utilisés ?

    faire une sorte de OR entre les permissions et en prendre le résultat alors... Je crois que je ferai ca oué, comme ca si on a des permissions sur un rang spécifique, et un autre pour une toute autre chose, il faut pas créer un nouveau rang mais donner simplement les deux rangs au meme membre selon tes tables KoD ! oué, c'est pas le plus léger à coder, quoique, mais c'est le mieux pour les utilisateurs plus tard !


    merci aussi pour ton modele en Java AcidBird, je vais mixer ca avec la bd du style de KoD jpense...



    Très bien ça, merci bcp à vous tous :)
    Ahava, 7 Mars 2007
    #17
Statut de la discussion:
Fermée.