IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Redirection dans un plugin [FAQ]


Sujet :

MVC PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2003
    Messages : 46
    Points : 51
    Points
    51
    Par défaut Redirection dans un plugin
    Bonjour,

    Je débute avec le zend framework, et je rencontre un probleme avec l'utilisation des plugins.

    Pour detailler:

    Je developpe pour mon site un systeme de gestion des ACL (ce systeme fonctionne correctement)

    pour effectuer le controle je developpe un plugin, le controle s'effectue correctement, mais au moment de faire la redirection vers la page de login (quand pas les droits par exemple), le script boucle et appel la requete initiale.

    Je vous donne le code de mon plugin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    class Auth_AuthPlugin extends Zend_Controller_Plugin_Abstract
    {
      private $_acl;
      private $_auth;
     
      private $_noauth = array('module' => 'default',
                               'controller' => 'login',
                               'action' => 'index');
     
      private $_noacl = array('module' => 'default',
                              'controller' => 'error',
                              'action' => 'privileges');
     
      public function __construct($acl,$auth)
      {
        $this->_acl = $acl;
        $this->_auth = $auth;
      }
     
      public function preDispatch($request)
      {
        if($this->_auth->hasIdentity())
        {
          $identity = $this->_auth->getIdentity();
          $role = $identity["role"];
        }
        else
        {
          $role = 'guest';
        }
     
        $controller = $request->controller;
        $module = $request->module;
        $action = $request->action;
     
        $resource = $controller;
     
     
        if(!$this->_acl->has($resource))
        {
          $resource = null;
        }
     
        if (!$this->_acl->isAllowed($role, $resource, $action)) {
                if (!$this->_auth->hasIdentity()) {
                    $module = $this->_noauth['module'];
                    $controller = $this->_noauth['controller'];
                    $action = $this->_noauth['action'];
                    echo "pas d'identite</br>";
                    }
                else
                {
                    $module = $this->_noacl['module'];
                    $controller = $this->_noacl['controller'];
                    $action = $this->_noacl['action'];
                    echo $controller."</br>";
                    echo $module."</br>";
                    echo $action."</br>";
                    echo "pas d'acl</br>";
                    $request->setModuleName($module);
                    $request->setControllerName($controller); 
                    $request->setActionName($action); 
                    $request->setDispatched( false );
                }    
        }
      }
    }
    Merci de m'expliquer comment effectuer la bonne redirection a partir du module.

    Cereal59

  2. #2
    vvm
    vvm est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    as tu mis des d'accès sur le controller Login ??
    Je pense que le controller Login est soumis à une limitation d'accès (où plutôt tu ne l'a pas autorisé pour les profils "guest". vérifie.

    Si ce n'est pas ça. peut on voir les attributions d'accès que tu as pu faire ?

    bonne chance.

  3. #3
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Quand tu es dans le cas du "if (!$this->_auth->hasIdentity())", il faut que tu définisses le nouveau module/controller/action avec $request->setModuleName() etc.
    Mais il ne faut pas déclarer $request->setDispatched(false);

    Pourquoi ? En fait, dans les sources du Front Controller, lors du dispatch, on a cette portion de code (zf 0.8.0) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    do {
        $request->setDispatched(true);
     
        /**
         * Notify plugins of dispatch startup
         */
        $this->_plugins->preDispatch($request); // Appel ton plugin::preDispatch()
     
        /**
         * Skip requested action if preDispatch() has reset it
         */
        if (!$request->isDispatched()) {
            continue; // Loop Ad Vitam Aeternam!!
        }
     
        /**
         * Dispatch request
         */
        $dispatcher->dispatch($request, $response);
     
        /**
         * Notify plugins of dispatch completion
         */
        $this->_plugins->postDispatch($request);
    } while (!$request->isDispatched());
    Donc on comprend aussi pourquoi dans le cas du "if ($this->_auth->hasIdentity())" c'est à dire le "else", il y a une boucle sans fin.

    Bien sûr, comme l'a dit vvm, assure toi que les guests ont les droits pour accéder au controller de login

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2003
    Messages : 46
    Points : 51
    Points
    51
    Par défaut
    Bonjour

    Merci pour vos réponses,

    J'avais effectivement un probleme sur les ACL en fait du fait de l'organisation en modules de mon application, mes ACL sont declarées de la maniere suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $acl->allow(role,nom_du_module,action);
    et lors du test dans le plugin j'utilisai le controlleur.

    Ensuite j'ai enlevé les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $request->setDispatched(false);
    Et ca fonctionne !!!

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redirection dans un fichier
    Par radium dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 09/08/2005, 14h45
  2. [Plugin][SWT] FileSelectionDialog dans un plugin
    Par vberetti dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 17/06/2005, 17h37
  3. [plugin] [jar] ajouter un jar dans un plugin
    Par Mobius dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 01/06/2005, 10h44
  4. Catcher une exception lancée dans un plugin
    Par :Bronsky: dans le forum C++
    Réponses: 8
    Dernier message: 18/01/2005, 00h38
  5. Trouver les redirections dans des traces
    Par severine dans le forum Développement
    Réponses: 3
    Dernier message: 21/04/2004, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo