Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour
Je cherche un moyen de rediriger les utilisateurs non loggé, peut importe sur quel page ils sont.
Mon login/logout marche bien.
Cependant, pour rediriger vers le formulaire il faut que j'utilisateur soit dans le AuthController, or en tapant dans la barre d'adresse ce qu'il veut il peut y échapper.
J'ai pensé à mettre le code suivant dans le bootstrap mais il ne fonctionne pas
il y a un problème au niveau du _redirect !
public function _initPreDispatchAuthentification() { $auth = Zend_Auth::getInstance(); if (!$auth->hasIdentity()) { $this->_redirect('index'); }
Aussi je peux le mettre dans le layout, mais il y a la même erreur.
edit :
voici l'erreur du bootsrtap au cas ou
Fatal error: Uncaught exception 'Zend_Application_Bootstrap_Exception' with message 'Invalid method "_redirect"' in
Dans ce cas comment faites-vous ?
Merci
Dernière modification par maryooman (15-04-2010 11:56:59)
Hors ligne
C'est pas plutot $this->_forward() ou $this->_redirector->gotoUrl(); ???
Hors ligne
Salut
Tu devrais mettre cela dans le preDispatch() de ton controller. Ainsi tu pourras aussi choisir plus tard si tu veux un utilisateur connecté ou non selon les action.
De plus, tu risques de créer une boucle si tu mets ça dans ton bootstrap (à chaque fois qu'un utilisateur veut afficher le formulaire de connexion il serait redirigé vers ce même formulaire en boucle...).
++
Hors ligne
@shadypierre _redirect marche bien chez moi, je n'ai pas fais de helper, c'était déjà là.
@ubini : c'est une bonne remarque par rapport à la boucle créé avec le bootstrap!
donc si j'ai bien compris je fais un preDispatch() dans le controller Auth contenant le code que j'ai mis plus haut.
public function preDispatch() { $auth = Zend_Auth::getInstance(); if(!$auth->hasIdentity()) { $this->_redirect('/authentication/login'); } }
Cela fonctionne très bien, j'ai une boucle infini, en faite c'est logique.
Maintenant je ne vois pas quoi mettre dans le preDispatch().
J'ai cherché et trouvé ça : http://www.zimuel.it/blog/?p=86
Il y a un preDispatch() écrit, mais je ne comprends pas vraiment comment il marche.
De plus, quand je suis dans les autres pages, différent du controller Auth, le preDispatch() n’agie pas, et c’est logique. Comment doit-il être appelé dans chaque controller ? recopier le preDispatch() dans chaqu'un?
Dernière modification par maryooman (15-04-2010 13:55:16)
Hors ligne
le mieux est de créer un contrôleur principal puis de créer l'héritage sur tous les contrôleurs que tu as déjà créé.
public function preDispatch() { $auth = Zend_Auth::getInstance(); if(! $auth->hasIdentity() AND $this->_request->getControllerName() != 'authentication' // si plusieurs action nommées login AND $this->_request->getActionName() != 'login') { $this->_redirect('/authentication/login'); } }
Dernière modification par ubini (15-04-2010 14:09:42)
Hors ligne
c'est exactement ca, merci beaucoup
en ce qui concerne l'héritage des controllers, je ne sais pas exactement comment m'y prendre,
en gros chaque Controller implements IndexController ? Ta réponse m'intéraisse.
Pour l'instant je me suis contanté de recopier le predispatch() dans chaque controller, c'est assez naif mais celà fonctionne.
et merci encore !!
Hors ligne
en gros, tu rajoutes une classe entre IndexController et Zend_Controller_Action. Tu peux appeler ta classe Main_Controller_Action par exemple. Puis chacun de tes controlleur peut profiter de l'héritage.
class IndexControllerAction extends Main_Controller_Action { } class Main_Controller_Action extends Zend_Controller_Action { }
ensuite, c'est juste de vérifier depuis la fonction preDispatch mais ce n'est pas à elle de le faire :
class IndexControllerAction extends Main_Controller_Action { } class Main_Controller_Action extends Zend_Controller_Action { public function preDispatch() // c'est le preDispatch par défaut.... { $this->requireLogin(); } public function requireLogin() { $auth = Zend_Auth::getInstance(); if(!$auth->hasIdentity()) { $this->_redirect('/authentication/login'); } } }
comme ça après tu peux faire :
class IndexControllerAction extends Main_Controller_Action { public function preDispatch() // c'est le preDispatch qui va être utilisé car plus haut dans la hiérarchie { // vide donc pas de login requis } public function publicAction() { .... } public function privateAction() { $this->requireLogin(); .... } } class Main_Controller_Action extends Zend_Controller_Action { public function preDispatch() // c'est le preDispatch par défaut.... { $this->requireLogin(); } public function requireLogin() { $auth = Zend_Auth::getInstance(); if(!$auth->hasIdentity()) { $this->_redirect('/authentication/login'); } } }
J'espère que cela t'aidera un peu...
Dernière modification par ubini (15-04-2010 16:45:54)
Hors ligne
Je place l'url demandé en session
ainsi lorsque l'utilisateur est logé il arrive sur la page demandé et non sur une autre page.
j'ajoute un bouton annuler dans la page de login si l'utilisateur annule il reviens sur l'action avant celle ayant amené au login.
A+JYT
Hors ligne
Une autre solution que l'héritage, ce sont les plugins de controller. Tu écris ton plugin:
class Controller_Plugin_Authentification extends Zend_Controller_Plugin_Abstract { public function preDispatch() { $auth = Zend_Auth::getInstance(); if(! $auth->hasIdentity() AND $this->_request->getControllerName() != 'authentication' // si plusieurs action nommées login AND $this->_request->getActionName() != 'login') { $this->_redirect('/authentication/login'); } } }
Ensuite dans ton bootstrap tu indiques le plugin, ou mieux dans ton fichier ini de configuration:
resources.frontController.plugins.Authentification = "Controller_Plugin_Authentification"
Ton plugin sera exécuté pour tous les controllers que tu as et pas besoin d'hériter d'un controller en particulier.
Hors ligne
Vos réponses sont excellentes, j'ai tellement appris avec ZF et ce forum .
Depuis que j'ai commencé avec ZF il y a 3 mois, je me suis rendu compte de la profondeur de ce langage.
Pour ma part, j'ai choisi d'utiliser la solution 'ZF', c'est à dire avec le plugin.
Cependant j'ai un problème, la classe n’est pas trouvée :
Je l'ai mis dans
Application
configs
application.ini
controllers
plugin
Auth.php <--------ICI
UnController.php
models
etc ...
Bootstrap.php
Avec le fichier ini le message est le suivant
Fatal error: Class 'Controller_Plugin_Authentification' not found in C:\wamp\www\test\library\Zend\Application\Resource\Frontcontroller.php on line 111
Avec le bootstrap
protected function _initPluginController() { $frontController = Zend_Controller_Front::getInstance(); $frontController->registerPlugin(new Controller_Plugin_Authentification); }
Fatal error: Class 'Controller_Plugin_Authentification' not found in C:\wamp\www\test\application\Bootstrap.php on line 58
J'ai bien cherché avant d'écrire le message, j'ai lu des tutos et des exemples.
C'est pour cette raison que je ne vois pas mon erreur.
Juste pour précision, le plugin je l'ai créé d'un fichier vide. Je n'ai pas utilisé la commande : zf create controller Authentification
Dernière modification par maryooman (16-04-2010 11:38:42)
Hors ligne
http://framework.zend.com/manual/fr/zen … oader.html
Pourquoi mettre ce plugin dans ton application ? c'est un plugin que tu peux réutiliser facilement pour d'autres projets futurs. Il est donc temps de créer ta propre libraire (en parallèle à la librairie Zend )
Dernière modification par ubini (16-04-2010 13:39:14)
Hors ligne
Moi j'ai cette ligne en plus dans mon fichier de config qui précise le répertoire des plugins:
resources.frontController.controllerDirectory.default = APPLICATION_PATH "/controllers"
Hors ligne
j'ai essayé certaines choses :
resources.frontController.controllerDirectory.default = APPLICATION_PATH "/controllers"
ne fonctionne pas avec l'erreur suivante
Fatal error: Uncaught exception 'Zend_Config_Exception' with message 'Cannot create sub-key for 'controllerDirectory' as key already exists' in C:\wamp\www\test\library\Zend\Config\Ini.php:293
puis
resources.frontController.controllersDirectory.default = APPLICATION_PATH "/controllers"
resources.frontController.pluginDirectory.default = APPLICATION_PATH "/controllers/plugin"
resources.frontController.plugin.Authentification = "Controller_Plugin_Authentification"
ça non plus
mais pas d'erreur, juste le plugin ne fonction pas
et j'ai regardé dans le lien de ubini
autoloaderPluginPath = "application/controllers/plugin"
et
public function _initPlug()
{
$loader = new Zend_Loader_PluginLoader();
$loader->addPrefixPath('Controller_Plugin_Authentification', 'application/controllers/plugin/Authentification');
$loader->load('Authentification');
}
ne fonctionne pas lance une erreur :
Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'Authentification' was not found in the registry; used paths: Controller_Plugin_Authentification_: application/controllers/plugin/Authentification/' in C:\wamp\www\test\library\Zend\Loader\PluginLoader.php
Je sais c'est pas très pro mais je ne sais pas quoi faire d'autre
Dernière modification par maryooman (16-04-2010 14:55:41)
Hors ligne
Si tu précises le chemin direct de ton répertoire de plugin, alors je pense que ton plugin ne devrait s'appeler que Authetification et pas Controller_Plugin_Authentification (qui doit se trouver dans une arborescence controller\plugin\authetification.php)
De plus pourrais-tu essayer de mettre un chemin complet dans autoloaderPluginPath en utilisant la constante APPLICATION_PATH par exemple.
Hors ligne
autoloaderPluginPath = APPLICATION_PATH "/controllers/plugin"
ou
autoloaderPluginPath = APPLICATION_PATH "/application/controllers/plugin"
ne change rien
j'ai essayé ça
autoloaderPluginPath = APPLICATION_PATH "/application/controllers/plugin"
resources.frontController.plugin.Authentification = "Authentification"
je l'ai renommé, j'ai fait plusieurs combinaisons
mais toujour rien
EDIT : pour l'instant laissons ça comme tel.
Quand j'aurais plus d'expérience et de connaissance du ZF je reviendrai dessus
Je vous suis très reconnaissant de m'avoir aidé
Dernière modification par maryooman (19-04-2010 09:36:42)
Hors ligne
Pages: 1