Bonjour à tous,
je suis, une fois de plus, confronté à un petit problème de réflection...
Je souhaite mettre en place sur un blog un système de gestion des membres avec des actions plus ou moins limitées en fonction du rôle de l'utilisateur.
Ce que j'aimerais, pour l'instant, c'est quelque chose du genre :

  • admin : peut tout faire;
  • auteur : peut créer, éditer et supprimer ses propres articles.

Et par la suite peut être rajouter d'autres niveaux de permissions si le besoin se fait sentir.

Pour l'instant, j'ai au niveaux de mes controller des actions préfixées par admin_ mais je souhaiterais que quelques actions avec ce préfixe soient aussi accessibles pour le rôle "auteur" afin de ne pas écrire plusieurs fois la même action.
Par ailleurs, au niveau de mon panel admin, j'aimerais que certains menus ne soient pas accessibles par le rôle "auteur" mais qu'il possède certains liens qui lui son propre.

D'où mes questions :

  • Comment gérer mes actions au niveau du controller pour qu'elles soient accessibles à plusieurs niveaux de permission afin de ne pas répéter mon code ?
  • Comment gérer les liens du menu pour chaque rôle (un menu spécifique qui se charge en fonction du rôle ou autre solutions ) ?

Merci d'avance pour vos réponses et bien entendu, passez de bonnes fêtes !!!

7 réponses


antho07
Réponse acceptée

Bonjour,

tu parles de gestions de rôle .. Si j'ai bien compris , ton problème n'est pas d'ordre de hierarchie des rôles mais plutôt un problème d'accès sous conditions.

En effet, le rôle auteur comme tu l'entends n'est pas quelque chose d'acquis à la connexion mais est tributaire de la ressource sur laquelle un accès à l'action est demandée.

Un exemple pour comprendre ce que je veux dire... Si Paul a le droit de modifier l'article 4, Robert lui ne peut pas n'étant pas l'auteur. Ici cette autorisation dépend de la ressource (l'article 4) et pas du rôle de Paul ou Robert. Dans cet exemple, aucun n'est admin.

L'implémentation que je ferai est la suivante :

-> Je rendrai disponible à tous les membres l'accès à l'édition des articles.
-> Dans mon controller j'aurais une méthode privée. isAuthorFromArticle($idArticle,$idUser ou $session) .
Cette méthode verifie si l'utilisateur est admin, dans ce cas elle renvoit true.
Sinon elle compare l'auteur de l'article avec l'utilisateur connecté , renvoit ainsi true ou false.

-> Ce qui donnerait

edit($id){
if(isAuthorFromArticle($id,$this->Session->Auth('id')){
//On rentre ici dans le traitement autorisé
else {
//On rentre dans le refus
}
}

En relisant maintenant ton poste, je comprends qu'il n'y a que certains utilisateurs habilités à être auteur.
On peut donc hierarchiser les rôles => admin > auteur et faire un premier filtrage d'authorisation dans le biforeFilter avec la méthode isAuthorized (voir doc).
Un layout différent pourra être attribué à ce rôle spécifique (cela répondra au besoin pour le menu)

En résumé :

  • Un premier filtrage grâce aux rôles 'auteur' et 'admin' avec isAuthorized (le prefix auteur accessible aux admins)
  • Un second filtrage qui vérifie l'auteur dans le cas ou la personne n'est pas admin.
  • Un layout différent si la personne est author

Cela devrait correspondre au besoin

Cordialement

Antho

Lartak
Réponse acceptée

Bonsoir.
@antho07 : Non tu n'as pas compris, c'est quoi ton histoire de pouvoir ou non être auteur ?
Ce n'est pas ça la question, lors de la création d'un article, s'il sauvegarde bien l'id de l'utilisateur, il lui suffit juste de vérifier si l'utilisateur connecté correspond bien à l'utilisateur qui a créé l'article.
Pour être plus clair, tu peux sécuriser ton système à deux niveaux.
Le premier sur la vue qui affiche l'article, en n'affichant les liens d'éditions et de suppression seulement si l'utilisateur qui a créé l'article correspond bien à l'utilisateur connecté via la session et le deuxième niveau c'est au niveau de la sauvegarde (genre fonction edit), lors de la détection de données postées via le formulaire, tu vérifies si la correspondance avant de faire la sauvegarde.
Ensuite, je te déconseille de faire un mélange entre ton dashboard (ton espace d'administration) et des utilisateurs génériques, pour l'histoire des menus, je ne vois pas trop ce que tu veux dire, étant donné que ton système d'application n'est pas suffisament complexe pour qu'il y ait beaucoup de contenus différents pouvant être créés ou modifier par les utilisateurs.
Penses à regarder des tutoriels effectués par Grafikart dans certains il explique justement ce que tu demandes.

@Lartak Dans sa question je vois deux niveaux de filtrage.

Un rôle auteur (appuyé par la demande de menu différent) et puis l'auteur réel de l'article (qui possède bien un rôle auteur aussi)

Mais si j'ai mal compris... au temps pour moi ...

@Maxwell: Ne lui compliques pas les choses, s'il a déja un peu de mal avec un système de permission relativement simple, il va s'y perdre avec les ACL. :)
@antho07: Il n'y a pas vraiment de système de rôles dans son projet, c'est juste une gestion de permettre à l'utilisateur de gérer ses propres articles, il n'a même pas besoin de layout particulier pour faire ça.
Un layout général et un layout pour l'admin.
C'est un système de blog, rien de bien complexe, je pense qu'il a juste besoin d'un peu de réflexion, rien de plus.

@Lartak je te trouve catégorique dans la compréhension de son besoin. Pour moi ce n'est pas clair.

Un système ou il y a des lecteurs, des auteurs et des admins est aussi possible. Laissons l'intéressé répondre sur ce point.

De toute façon, en piochant dans les postes sur ce fil, les éléments d'implémentations sont dispo quelques soit la réalité du besoin.

Joyeux Noël au passage

Pour Ton probleme tu as deux solutions Celui de gros Bourrin et celui de l'acl
Pour Acl je te renvoie a la doc de cakephp
Pour celui de Gros bourrin, tu peux passer par la création de multiples layouts qui seront accessibles a des utilisateur ayant un rôle spécifique par ex pour un membre ayant un rôle d'administrateur,il aura acces uniquement au layaout admin.Pour gerer cela, tu peux ecrire quelque chose comme ca dans la function beforeFilter de l'AppController

if($this->Session->read('Auth.User.role') == 'admin'){
              $this->layout = 'admin';
 }
  if($this->Session->read('Auth.User.role') == 'membre'){
                $this->layout = 'membre';
      }

Et dans les layaout tu spécifie les liens menant vers les actions que tu veux etc.Je crois que dans ton ex je te conseille la methode de gros bourrin.Puisque c'est ce que j'utilise et ca fonctionne tres tres Bien.Joyeux Noel au passage

Romano83
Auteur

Bonjour à tous et merci pour vos réponses.

@Maxwell : j'ai déjà regardé du côté des ACL et je pense que c'est une vrai usine à gaz par rapport à ce que je souhaite faire. Il me semble que je peux me débrouiller avec autre chose de plus simple ;)

Je pense que la solution d'antho07 se rapproche plus de mon problème.
Comme le dit bien Lartak11, c'est juste des pistes de réflexion dont j'ai besoin.
J'ai regardé les tutos que propose Grafikart et c'est suite à ces visionnages que j'ai besoin de plus de réflexion...

@Lartak11 : le blog est juste une partie de l'application. Si ce n'était qu'un simple blog, je me poserai certainement moins de questions quant à la gestion du panel admin.

Pour apporter plus de précisions quant à la structure de l'application, il y a une partie portfolio et une partie blog. Les deux parties sont en "accès libre" aux visiteurs.
Par contre, au niveau administration, l'admin a l'accès exclusif au portfolio et peut, bien entendu, au niveau du blog ajouter/editer/supprimer ses articles et les articles des autres auteurs. En revanche, les auteurs peuvent ajouter des articles mais ne peuvent editer/supprimer que leurs propres articles.

Si vous souhaitez plus de précisions, ou si ce n'est pas très clair, dite le moi ;)

En attendant,
Joyeux Noël !!!