Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-04-2010 11:43:07

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

redirection vers formulaire login quelque soit la page du site

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 !

Code:

        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

 

#2 15-04-2010 12:02:01

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: redirection vers formulaire login quelque soit la page du site

C'est pas plutot $this->_forward() ou $this->_redirector->gotoUrl(); ???

Hors ligne

 

#3 15-04-2010 13:07:02

ubini
Membre
Lieu: gillarens/Suisse
Date d'inscription: 23-01-2008
Messages: 110
Site web

Re: redirection vers formulaire login quelque soit la page du site

Salut smile

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...).

++


http://www.easyswap.org - site d'échange de biens et de services conçu avec jQuery et Zend Framework
http://www.lambelet.net - mon blog perso et inutile

Hors ligne

 

#4 15-04-2010 13:53:27

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: redirection vers formulaire login quelque soit la page du site

@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.

Code:

    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

 

#5 15-04-2010 14:04:29

ubini
Membre
Lieu: gillarens/Suisse
Date d'inscription: 23-01-2008
Messages: 110
Site web

Re: redirection vers formulaire login quelque soit la page du site

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éé.

Code:

   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)


http://www.easyswap.org - site d'échange de biens et de services conçu avec jQuery et Zend Framework
http://www.lambelet.net - mon blog perso et inutile

Hors ligne

 

#6 15-04-2010 15:21:06

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: redirection vers formulaire login quelque soit la page du site

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 big_smile !!

Hors ligne

 

#7 15-04-2010 16:44:55

ubini
Membre
Lieu: gillarens/Suisse
Date d'inscription: 23-01-2008
Messages: 110
Site web

Re: redirection vers formulaire login quelque soit la page du site

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.

Code:

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 :

Code:

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 :

Code:

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... smile

Dernière modification par ubini (15-04-2010 16:45:54)


http://www.easyswap.org - site d'échange de biens et de services conçu avec jQuery et Zend Framework
http://www.lambelet.net - mon blog perso et inutile

Hors ligne

 

#8 15-04-2010 16:58:44

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: redirection vers formulaire login quelque soit la page du site

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

 

#9 16-04-2010 09:55:05

Ithier
Membre
Date d'inscription: 05-01-2010
Messages: 85

Re: redirection vers formulaire login quelque soit la page du site

Une autre solution que l'héritage, ce sont les plugins de controller. Tu écris ton plugin:

Code:

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

 

#10 16-04-2010 11:38:03

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: redirection vers formulaire login quelque soit la page du site

Vos réponses sont excellentes, j'ai tellement appris avec ZF et ce forum big_smile.
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

Code:

        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

 

#11 16-04-2010 13:34:59

ubini
Membre
Lieu: gillarens/Suisse
Date d'inscription: 23-01-2008
Messages: 110
Site web

Re: redirection vers formulaire login quelque soit la page du site

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 wink)

Dernière modification par ubini (16-04-2010 13:39:14)


http://www.easyswap.org - site d'échange de biens et de services conçu avec jQuery et Zend Framework
http://www.lambelet.net - mon blog perso et inutile

Hors ligne

 

#12 16-04-2010 13:57:43

Ithier
Membre
Date d'inscription: 05-01-2010
Messages: 85

Re: redirection vers formulaire login quelque soit la page du site

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

 

#13 16-04-2010 14:51:45

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: redirection vers formulaire login quelque soit la page du site

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

 

#14 16-04-2010 16:43:34

Ithier
Membre
Date d'inscription: 05-01-2010
Messages: 85

Re: redirection vers formulaire login quelque soit la page du site

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

 

#15 16-04-2010 17:34:48

maryooman
Membre
Date d'inscription: 15-02-2010
Messages: 106

Re: redirection vers formulaire login quelque soit la page du site

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages