Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour
Pour protéger l'accès à certaines pages j'ai intégré une fonction predispatch() dans chaque contrôleur (truc classique):
function preDispatch() { $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { $this->_redirect('auth/login'); $this->view->message='Vous n\'êtes pas autorisés à accéder à cette page.<br>' .'Veuillez vous authentifier.'; } }
A chaque fois, que l'utilisateur accède à cette page et qu'il n'est pas authentifié, il est redirigé vers la page de login avec l'affichage d'un message. Malheureusement, ce message ne s'affiche pas.
Je voudrais également pouvoir rediriger l'utilisateur vers la page demandée après son authentification mais je ne sais pas comment faire.
Dans mon fichier login.phtml j'ai :
<?php if(!empty($this->message)) :?> <div id="message"> <?php echo $this->escape($this->message);?> </div> <?php endif; ?> <form action="<?php echo $this->baseUrl ?>/auth/login" method="post"> .... </form>
Merci
Hors ligne
Hello,
C'est normal, tu n'es plus dans le même contexte de requête HTTP après un redirection donc $this->view->message n'existe plus.
Regardes l'helper FlashMEssenger pour faire transiter des messages entre tes requêtes
A+
Hors ligne
J'ai changé mon code ainsi :
Dans la page à protéger :
function preDispatch() { $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { $this->_redirect('auth/login'); AuthController::getHelper('FlashMessenger')->addMessage('YOU R NOT LOGGED IN'); } }
Ensuite dans mon loginAction
public function loginAction() { $this->view->message = $this->getHelper('FlashMessenger')->getMessages(); .... }
ça ne marche pas?
Excusez mon ignorance!
But,Where is l'erreur?!!!
Dernière modification par ziedb (05-12-2008 15:14:57)
Hors ligne
Hello,
A vue de nez, j'aurais mis le message avant le redirect.
A+
Hors ligne
J'ai crée un plugin MyAuthPlugin et un contrôleur d'authentification extrait d'un tuto sur developpez.com.
Pour implifier le problème, si considère un seul contrôleur 'index' et une seule action 'index'.
Si j'essaie d'accéder à cette page et que je ne suis pas authentifié, je suis redirigé vers /auth/login.
Si le login se passe bien, je suis redirigé vers monsite/index/index/.
Firefox m'indique un message 'Firexfox a détecté que cette requête n'aboutira pas' et dans la bare d'adresse je trouve une url du type 'mosite/auth/auth/auth/auth/auth/auth...'
Par contre quand j'ai changé la fonction preDispatch() par dispatchLoopStartup() tout marche bien.
Est-ce que quelqu'un peut m'expliquer le phénomène? Si j'ai des erreurs dans mon code, lesquels?
Merci
/** *AuthController.php * */ public function loginAction() { $this->view->message = ''; if ($this->_request->isPost()) { .... $auth = Zend_Auth::getInstance(); $result = $auth->authenticate($authAdapter); if ($result->isValid()) { // success: store database row to auth's storage // system. (Not the password though!) $data = $authAdapter->getResultRowObject(null, 'password'); $auth->getStorage()->write($data); //$this->view->message='Login OK'; $this->_redirect('/'); } else { // failure: clear database row from session $this->view->message = 'Login failed.'; } } } .... } }
require_once 'Zend/Loader/PluginLoader.php'; /** * MyAuthPlugin.php * */ class MyAuthPlugin extends Zend_Controller_Plugin_Abstract { public function __construct(){ } public function predispatch (Zend_Controller_Request_Abstract $requete) { $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity() && !($requete->getControllerName() == 'auth' && $requete->getActionName()=='login' && $requete->getModuleName() == 'default')) { $front = Zend_Controller_Front::getInstance(); $response = $front->getResponse(); $response->setRedirect('auth/login'); $response->sendHeaders(); exit; } } }
Hors ligne
ziedb a écrit:
Code:
$response->setRedirect('auth/login');
Manquerait pas un / ?
$response->setRedirect('/auth/login');
J'ai jamais utilisé dispatchLoopStartup, mais je suis pas sur que l'action y soit correctement initialisée. Ce qui expliquerai que ça fonctionne.
Dernière modification par mdelanno (10-12-2008 16:56:01)
Hors ligne
Perso, je ne fais pas de redirect.. je change juste le module/controller/action demandé.
Une sorte de forward..
Sinon, pour le changement de comportement, c'est simple
Dans DispatchLoopStartup, tu n'y passes qu'une fois par execution.
preDispatch, tu passes à chaque action que tu dispatches
Hors ligne
Pages: 1