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

Statut
N'est pas ouverte pour d'autres réponses.

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 :)
 

k o D

Elite
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 ^^
 

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 ;)
 

k o D

Elite
Froggy a dit:
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 ;)
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 ;)
 

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.
 
1er
OP
Ahava

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 ^^
 

k o D

Elite
De rien :)
 
1er
OP
Ahava

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 ?
 

[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
 

Froggy

fake geek
Ahava a dit:
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 ?
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.
 

xe0n

Chamois d'or
Ahava a dit:
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 ?
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

Chamois d'or
Froggy a dit:
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.
je pense pas que ce soit terrible si le programme doit etre facilement administrable (ajouter des rangs entrainera une modification du code)
 

AcidBird

Elite
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
 
1er
OP
Ahava

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...
 

AcidBird

Elite
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 ;)
 

k o D

Elite
Si tu veux plusieurs permissions possibles pour une personne implémente celà de cette manière:



(Note que les traits sont incorrects c'est bien une relation m à n entre la table membres et permissions grâce à lignesPermission)
 
1er
OP
Ahava

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 :)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut