Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Voila actuellement, je suis entrain de créer un formulaire de connexion pour la partie admin de mon site. J'ai donc un module :
/application
/default
/login
/panel
dans le controller default j'ai créer ce code qui permet de faire une redirection :
public function preDispatch ( ) { $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { $this->_redirect('/login'); } else { $this->_redirect('/panel'); } }
dans le panel, j'ai fait ceci :
public function indexAction ( ) { $auth = Zend_Auth::getInstance ( ); if ( !$auth->hasIdentity ( ) ) { $this->_redirect('/login'); }
et dans le login :
public function indexAction ( ) { $auth = Zend_Auth::getInstance ( ); if ( $auth->hasIdentity ( ) ) { $this->_redirect('/panel'); }
Mais est ce qu'il n'y a pas un moyen plus simple de dire a tous les module (et futur module) que si l'utilisateur n'est pas connecté il va sur login autrement, il n'a pas acces au login mais au reste du site.
Pour voir la structure de mon application passez par ici
merci d'avance de vos consseils
Hors ligne
Salut nicko,
Pour gérer ce problème là, j'ai utilisé un plugin qui comprend une fonction preDispatch(). En fait, cette méthode méthode est appelée à chaque fois que l'utilisateur veut accéder à une ressource.
Je pense donc que tu pourrais regarder de ce côté là. Voici la première version de mon plugin.
class MyPluginAuth extends Zend_Controller_Plugin_Abstract { private $_auth; private $_acl; private $_noauth = array('module' => 'default', 'controller' => 'login', 'action' => 'index'); private $_noacl = array('module' => 'default', 'controller' => 'error', 'action' => 'privileges'); public function __construct($auth, $acl) { $this->_auth = $auth; $this->_acl = $acl; } public function preDispatch(Zend_Controller_Request_Abstract $request) { if($request->getControllerName() != 'auth') { if ($this->_auth->hasIdentity()) { $PER_DROITS = $_SESSION['informations']->PER_DROITS; // Recuperer içi le role de l'utilisateur connecté if($PER_DROITS == 1) $_SESSION['acl']['role'] = 'user'; elseif ($PER_DROITS == 405) $_SESSION['acl']['role'] = 'administrateur'; }else $_SESSION['acl']['role'] = 'visiteur'; $controller = $request->controller; $action = $request->action; $module = $request->module; $resource = $controller; if (!$this->_acl->has($resource)) $resource = 'Auth'; //test si l'utilisateur est autorisé à la ressource (controller) demandé if (!$this->_acl->isAllowed($_SESSION['acl']['role'], $resource, $action)) { //n'est pas loggé ==> redirection vers page de login if (!$this->_auth->hasIdentity()) { $controller = 'Auth'; $action = 'login'; //n'est pas autorisé ==> redirigé vers la page d'index et non pas vers la ressource demandée } else { $module = 'default'; $controller = 'Index'; $action = 'index'; } } //redirection $request->setModuleName($module); $request->setControllerName($controller); $request->setActionName($action); }else{ $_SESSION['acl']['role'] = 'visiteur'; } } }
Et tu le déclares dans ton index.php comme ceci :
$frontController = Zend_Controller_Front::getInstance(); $frontController->registerPlugin(new MyPluginAuth($auth, $acl));
Cordialement,
Hors ligne
Je te remercie sincèrement. Car tu m'as aidé sur deux sujets.
Le premier c'est cette histoire d'authentification.
Et la deuxième tu m'as en plus expliqué avec un cas concret comment utiliser les plugins. J'ai pas tout compris mais ça m'ouvre de nouvelles perspectives ...
Mais petit question, voila mon code pour commencer :
class MyPluginAuth extends Zend_Controller_Plugin_Abstract { private $_auth; private $_noAuth = array( 'module' => 'panel', 'controller' => 'login', 'action' => 'index' ); public function __construct ( $auth ) { $this->_auth = $auth; } public function preDispatch( Zend_Controller_Request_Abstract $request ) { if ( $request->getControllerName ( ) != 'login' ) { if ( !$this->_auth->hasIdentity ( ) ) { $module = $this->_noAuth['module']; $controller = $this->_noAuth['controller']; $action = $this->_noAuth['action']; } else { $module = $request->module; $controller = $request->controller; $action = $request->action; } $request->setModuleName($module); $request->setControllerName($controller); $request->setActionName($action); } } }
Pour le moment j'ai fait simple.
Par contre l'url si j'ai bien compris de change pas.
Je m'explique :
www.exemple.com/panel dans mon cas, me donne accès aussi bien à ma vue et controller login que panel avec ce code. C'est bien ça ?
Dernière modification par nicko (27-05-2009 12:32:38)
Hors ligne
Ravi que ce morceau de code te soit utile.
En effet, l'URL ne change pas. Par conséquent, www.exemple.com/panel fera appel au controller PanelController et à l'action indexAction et affichera la vue index concernant le controller Panel.
Par contre, avant d'appeler ton controller et ta vue, la fonction preDispatch du plugin sera effectuée.
Petite optimisation sur ton code : ton morceau de code suivant peut-être supprimé
else { $module = $request->module; $controller = $request->controller; $action = $request->action; }
Puisque tu ne modifies pas le module/controller/action qui ont été appelé...
Cordialement,
Hors ligne
Merci beaucoup
Dernière modification par nicko (27-05-2009 13:32:23)
Hors ligne
Heu encore une petit question.
Donc ton plugin marche très bien. Par contre, comme l'url est créer en "dur" (si je peut le dire ainsi), du coup lorsque j'écris une url de ce type :
www.encore-mon-exemple.com/panel/login
Alors que je suis déjà connecté, il me considère connecté (ce qui est normal), mais il ne réécrit pas l'url réel. c'est à dire :
www.encore-mon-exemple.com/panel
J'ai donc essayer de faire ceci dans le plugin :
$this->_redirect ( '/' );
En pensant qu'il face de lui même la redirection lui même, mais ça n'a pas l'ai très bon. Car j'ai cette erreur qui me dit qu'il ne peut pas définir ma méthode:
Fatal error: Call to undefined method Plugin_Auth::_redirect() in \Auth.php on line 40
Tu vas me dire de toute manière, il n'a pas écrire l'url en "dur", mais je trouverais tout de même sympa qu'il soit convenablement redirigé avec la bonne url.
Merci pour votre aide.
Hors ligne
Salut,
Pourquoi dis-tu que l'URL est écrite en "dur" ? Puisque tu récupères le module/controller/action qui est appelé et tu rediriges vers ce module/controller/action. La seule URL en dur qu'il y est dans ce plugin c'est lorsque l'utilisateur n'est pas authentifié, et dans ce cas, tu es obligé de le mettre en dur...
Je ne comprends donc pas ton problème. Si tu pouvais m'éclairer un peu plus, je pourrais sûrement t'aider encore...
Cordialement,
Hors ligne
Lorsque je tape www.exemple.com/, c'est le login qui s'affiche si je ne suis pas connecté. Lorsque je me logue, c'est la même adresse qui s'affiche (www.exemple.com/) mais c'est mon panel qui est à l'écran.
Actuellement, j'essaye de faire en sorte que le personne n'accède pas à la page login (normal, il est déjà connecté), jusqu'a maintenant, j'y suis arrivé avec les conditions.
Mais lorsque je saisis www.exemple.com/panel/login, je reste sur le panel, mais l'url reste identique. Or il serait mieux que l'url se récrive comme ceci www.exemple.com/panel au lieu de rester www.exemple.com/panel/login.
Est ce que tu vois ce que je veux dire ?
Hors ligne
J'ai fini par trouver la réponse. En faite le problème que j'avais était de ne pas pouvoir faire de redirection dans le plugin.
Vois mon nouveau code qui pourra peut être servir à quelqu'un (Comme je découvre et je pose BEAUCOUP de question, je ne peux aider personne pour le moment. Alors je partage ) :
<?php class Plugin_Auth extends Zend_Controller_Plugin_Abstract { private $_auth; private $_noAuth = array( 'module' => 'panel', 'controller' => 'login', 'action' => 'index' ); public function __construct ( $auth ) { $this->_auth = $auth; } public function routeStartup ( Zend_Controller_Request_Abstract $request ) { $this->initView ( ); } private function initView ( ) { $view = new Zend_View ( ); $view->user = $this->_auth->getIdentity ( ); } public function preDispatch( Zend_Controller_Request_Abstract $request ) { $controller = $request->controller; $action = $request->action; $module = $request->module; if ( $request->getControllerName ( ) != 'login' ) { if ( !$this->_auth->hasIdentity ( ) ) { $module = $this->_noAuth['module']; $controller = $this->_noAuth['controller']; $action = $this->_noAuth['action']; } else { $module = 'panel'; $controller = 'index'; $action = 'index'; } } elseif ( $request->getControllerName ( ) == 'login' ) { if ( $this->_auth->hasIdentity ( ) ) { $this->_response->setRedirect('/'); } } $request->setModuleName ( $module ); $request->setControllerName ( $controller ); $request->setActionName ( $action ); } } ?>
Ce code ne gère pas les permissions pour le moment, mais je mettrais à jour en temps venue.
Par contre, dans les plugins est-il possible de mettre des valeurs dans zend_view par defaut. Par exemple des info de l'user ?
J'ai essayé mais je ne suis pas encore arrivé.
J'ai tenté cela :
public function routeShutdup ( Zend_Controller_Request_Abstract $request ) { $view = new Zend_View ( ); $view->user = $this->_auth->getIdentity ( ); }
mais dans le résultat dans le vue rien de s'affiche sauf l'erreur comme quoi la variable n'est definie (normal !). Car si j'ai bien compris c'est une action du plugin qui se passe avant le predispatch. J'ai donc essayé avec routeShutddown mais ça ne fonctionne pas non plus.
Dernière modification par nicko (28-05-2009 12:21:12)
Hors ligne
J'ajoute une question complémentaire pourquoi la méthode init ( ) dans ce plugin.
Peut être que je me trompe, mais dans un controller d'action, on peut mettre la méthode init ( ), pre et postDispatch ( ), ...
Dans mon plugin, il y a le preDispatch j'ai pensé à faire appel à un init ( ) pour y mettre mes valeurs par défaut mais ça ne fonctionne pas.
Exemple de mon controller d'action (celui qui se trouve dans le dossier controller du module) pour le panel :
public function init ( ) { $this->initView(); $this->view->user = Zend_Auth::getInstance()->getIdentity(); }
Ceci me permet de faire appel aux données de user dans ma vue :
<?php echo $this->user->username ?>
Je croyais donc que je pouvais simplement recopier la méthode init ( ) dans mon plugin, mais ça ne fonctionne pas. Pour temps on peut mettre un preDispatch dans controller d'action ? What ?
Hors ligne
Pages: 1