Isauthorized

Par arcoss 3x, il y a 9 ans


Bonjour,
Je viens de faire un système d'authentification avec 3 roles différents donc 3 préfix défferents aussi : membre, manager, admin.
Le problème est que quand je suis connecté en mode admin, je peux acceder à l'interface utilisateur car l'administrateur a un niveau plus haut que l'utilisateur membre et je ne veux pas que l'admin accède à l'interfaces des autres utilisateur avec un niveau plus bas.
Je vous mets le code de ma function Isauthorized dans mon appcontrolleur.php :

nction isAuthorized($user){ if(!isset($this->request->params['prefix'])){ return true; } $roles = array( 'admin' => 15, 'manager' => 10, 'membre' => 5 ); if(isset($roles[$this->request->params['prefix']])){ $lvlAction = $roles[$this->request->params['prefix']]; $lvlUser = $roles[$user['role']]; if($lvlUser >= $lvlAction){ return true; }else{ return false; } } return false; }

Merci d'avance !

6 réponses

Lartak, il y a 9 ans

Bonjour.
Si tu ne veux pas utiliser un système de rôle avec niveau, il te suffit de n'autoriser l'utilisateur que sur les fonctions dont le prefix correspond à son rôle.

arcoss 3x, il y a 9 ans

J'ai enlever ce qu'il fallait et ca ne marche pas ... Je te mets mon appcontroller.php en entier :

<?php App::uses('Controller', 'Controller'); class AppController extends Controller{ public $helpers = array('Text','Form','Html','Session','Cache'); public $components = array('Session','Cookie', 'Auth' => array( 'authenticate' => array( 'Form' => array( 'scope' => array('User.active' => 1) ) ) ) ); function beforeFilter(){ $this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false,'user'=>false,'superadmin'=>false); $this->Auth->authorize = array('Controller'); if(!isset($this->request->params['prefix'])){ $this->Auth->allow(); } if(isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'admin'){ $this->layout = 'admin'; } if(isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'user'){ $this->layout = 'user'; } } function isAuthorized($user){ if(!isset($this->request->params['prefix'])){ return true; } return false; } }

Merci

Lartak, il y a 9 ans

Tu pourrais par exemple faire quelque chose comme ça :

public function isAuthorized($user){ if (!isset($this->request->params['prefix'])){ return true; } return $this->request->params['prefix'] == $user['role']; }
arcoss 3x, il y a 9 ans

Merci ta solution fonctionne !!! Mais le problème restant c'est que quand il refuse l'accès à admin pour aller vers l'espace membre, il me redirige vers / et je voudrai qu'il me redirige vers /users/login ...

Lartak, il y a 9 ans

quand il refuse l'accès à admin pour aller vers l'espace membre, il me redirige vers / et je voudrai qu'il me redirige vers /users/login

Si l'utilisateur est connecté, il ne va pas faire la redirection vers l'action d'identification.
Donc à toi de faire en sorte par exemple de déconnecter l'utilisateur s'il essait d'accéder à une action qui ne lui est pas permise.
Je veux bien t'aider en te donnant des pistes ou accessoirement un peu de code, mais je ne vais pas te donner la réponse toute faite à chaque fois.

arcoss 3x, il y a 9 ans

Merci de votre aide !!! J'ai enfin réussis !! Je mets le code en cas de besoin.

function isAuthorized($user){ if(!isset($this->request->params['prefix'])){ return true; } if($user['role'] == 'admin' && isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'membre' || $this->request->params['prefix'] == 'manager'){ $this->redirect('/users/logout/'); }else{ return $this->request->params['prefix'] == $user['role']; } if($user['role'] == 'manager' && isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'membre' || $this->request->params['prefix'] == 'admin'){ $this->redirect('/users/logout/'); }else{ return $this->request->params['prefix'] == $user['role']; } if($user['role'] == 'membre' && isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'admin' || $this->request->params['prefix'] == 'manager'){ $this->redirect('/users/logout/'); }else{ return $this->request->params['prefix'] == $user['role']; } }