Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 27-05-2009 09:16:22

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

[Zend_Controller][1.8.0] Créer controller de base

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 :

Code:

    public function preDispatch ( )
    {
        $auth = Zend_Auth::getInstance();

        if (!$auth->hasIdentity()) 
        {
            $this->_redirect('/login');
        }
        else
        {
            $this->_redirect('/panel');
        }
    }

dans le panel, j'ai fait ceci :

Code:

    public function indexAction ( )
    {
                $auth = Zend_Auth::getInstance ( );
    
                if ( !$auth->hasIdentity ( ) ) 
        {
            $this->_redirect('/login');
        }

et dans le login :

Code:

    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

 

#2 27-05-2009 10:19:41

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [Zend_Controller][1.8.0] Créer controller de base

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.


Code:

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 :

Code:

$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new MyPluginAuth($auth, $acl));

Cordialement,


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#3 27-05-2009 12:31:40

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

Re: [Zend_Controller][1.8.0] Créer controller de base

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 :

Code:

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

 

#4 27-05-2009 13:25:35

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [Zend_Controller][1.8.0] Créer controller de base

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é

Code:

else
        {
            $module            = $request->module;
            $controller = $request->controller;
            $action            = $request->action;
        }

Puisque tu ne modifies pas le module/controller/action qui ont été appelé...

Cordialement,


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#5 27-05-2009 13:32:11

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

Re: [Zend_Controller][1.8.0] Créer controller de base

Merci beaucoup

Dernière modification par nicko (27-05-2009 13:32:23)

Hors ligne

 

#6 28-05-2009 08:17:05

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

Re: [Zend_Controller][1.8.0] Créer controller de base

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 :

Code:

$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

 

#7 28-05-2009 09:51:58

Nikko
Membre
Lieu: Rueil (Haut-de-Seine)
Date d'inscription: 19-12-2008
Messages: 95

Re: [Zend_Controller][1.8.0] Créer controller de base

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,


Nikko

Etudiant en école d'ingénieur à l'INSIA

Hors ligne

 

#8 28-05-2009 11:17:45

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

Re: [Zend_Controller][1.8.0] Créer controller de base

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

 

#9 28-05-2009 12:14:52

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

Re: [Zend_Controller][1.8.0] Créer controller de base

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

Code:

<?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 :

Code:

   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

 

#10 28-05-2009 17:59:00

nicko
Membre
Lieu: Chambéry
Date d'inscription: 25-05-2009
Messages: 190

Re: [Zend_Controller][1.8.0] Créer controller de base

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 :

Code:

    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 :

Code:

<?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 ? sad

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