Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-07-2008 21:09:22

Jocio
Membre
Lieu: Marseille
Date d'inscription: 06-07-2007
Messages: 42

Garder en mémoire l'url avant identification

Bonjour,

J'utilise le Zend Framework avec des fichier .htaccess qui me redirige vers le bootstrap quelque soit l'URL.
Lorsqu'un utilisateur n'est pas connecté, il est automatiquement redirigé vers le contrôleur de connexion pour qu'il s'identifie. J'aimerai le rediriger vers l'URL précédente juste après.

Il y a toujours le moyen de mettre l'URL dans une variable GET de l'identification, mais ça me plait pas trop de voir une URL dans une URL :-(

Quelqu'un a déjà eu ce problème ?

Merci d'avance pour votre aide.


Pouf c'est tout !

Hors ligne

 

#2 21-07-2008 08:36:30

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Garder en mémoire l'url avant identification

Bonjour,

Perso, j'ai tendance à mettre l'URL de retour directement en GET. Si tu n'es pas fan, tu peux l'encoder en base64.

Si vraiment tu veux un truc plus caché, tu peux créer une entrée du genre (en générant aléatoirement le "123") :

Code:

$_SESSION["urlList"] = array(
  "123"=>"http://monsite.com/ma_target_url
);

après tu fais une URL du type http://monsite.com/login?target=123
et tu vas chercher dans ta session l'URL correspondante.

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#3 21-07-2008 08:44:31

Jocio
Membre
Lieu: Marseille
Date d'inscription: 06-07-2007
Messages: 42

Re: Garder en mémoire l'url avant identification

En fait, j'ai déjà essayé de mettre dans la session et le récupérer.

Mais je sais pas quoi enregistrer et surtout ... quand :-s

exemple :
j'arrive sur http://hostname/rapport/afficher/

comme je suis pas encore connecté, je suis redirigé vers : http://hostname/account/login/

je m'identifie avec mon login et mon mot de passe

...

C'est à ce moment que je voudrait être redirigé vers : /rapport/afficher/
je peut le faire avec le code suivant dans l'action login de mon contrôleur account :

Code:

$this->_redirect('/rapport/afficher/');

mais je ne sais pas quand et comment sauvegarder dans la session '/rapport/afficher/' ... :-s


Pouf c'est tout !

Hors ligne

 

#4 21-07-2008 10:05:20

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

Re: Garder en mémoire l'url avant identification

Si je ne me trompe pas, tu peux récupérer l'url de la dernière page affichée avec la variable $_SERVER['HTTP_REFERER'].
1) Tu peux donc arrivé sur ta première page => http://hostname/rapport/afficher/,
2) tu es redirigé vers la page => http://hostname/account/login/,
à ce moment là tu récupères l'url de la page précédente,
tu l'enregistres directement en session $_SESSION["urlprec"] = "$_SERVER['HTTP_REFERER']"
3) et à la fin de ton traitement d'authentification, tu rediriges vers $_SESSION["urlprec"].

Je n'ai pas du tout testé mais je pense que c'est vers cette piste que je me dirigerai à ta place.

Dernière modification par slaughter (21-07-2008 10:06:01)

Hors ligne

 

#5 21-07-2008 13:12:47

Jocio
Membre
Lieu: Marseille
Date d'inscription: 06-07-2007
Messages: 42

Re: Garder en mémoire l'url avant identification

Et ben j'avais déjà testé comme tu as dit à la différence que j'ai utilisé $_SERVER['REQUEST_URI']

Et ça ne fonctionne pas parce que je sais pas comment enregistrer l'adresse de l'appel n-2
En effet, j'ai :
- appel à l'url voulu ( http://hostname/rapport/afficher/ )
- redirection vers identification en GET ( http://hostname/account/login/ )
- appel en POST à la page d'identification ( http://hostname/account/login/ )
=> c'est là que j'ai besoin de "/rapport/afficher/"
or je me retrouve avec "/account/login/" à cause de l'appel en GET ... la redirection ...

Je pense que je vais le faire à l'arrache en faisant des tests douteux au moment de la sauvegarde en session de l'URL voulu ... du genre tester si $_SERVER['HTTP_REFERER'] est différent de /account/login/ ...

Si quelqu'un a quelque chose de plus propre, je suis preneur :-)


Pouf c'est tout !

Hors ligne

 

#6 21-07-2008 13:46:50

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

Re: Garder en mémoire l'url avant identification

Oui.

Pour moi, il faut juste que tu fasses la sauvegarde de la page précédente quand tu arrives la première fois sur /account/login.
Tu peux détecter le deuxième coup que tu arrives après le POST et ne pas refaire la sauvegarde.

Je ne sais pas si je suis très clair.

Hors ligne

 

#7 21-07-2008 13:59:27

Jocio
Membre
Lieu: Marseille
Date d'inscription: 06-07-2007
Messages: 42

Re: Garder en mémoire l'url avant identification

Bon, finalement j'ai réussi non sans bidouillé un peu ...

code de mon bootstrap ( avant le dispatch ) :

Code:

$session = new Zend_Session_Namespace();
Zend_Registry::set('session', $session);

if ( ( null == $auth->getStorage()->read() )
        and ( $infosApp->baseurl.'/' != $_SERVER['REQUEST_URI'] )
        and ( $infosApp->baseurl.'/account/login/' != $_SERVER['REQUEST_URI'] ) ) {

        unset($session->url_prec);
        $url_prec = str_replace($infosApp->baseurl,'',$_SERVER['REQUEST_URI']);
        $session->url_prec = $url_prec;
}

La 2ème condition de mon if est là parce que j'ai fait des tests et que j'ai remarqué que je me prenais l'url de base alors j'ai mit ce test pour plus l'avoir et du coup ça marche ...
le str_replace me sert à virer la base url du site parce que le _redirect() la rajoute devant.

code de l'action login de mon contrôleur account :

Code:

// je verifie que la connection est ok

...

$session = Zend_Registry::get('session');
if ( isset($session->url_prec) ) {
        $this->_redirect($session->url_prec);
}

C'est pas très propre mais ça marche.

PS : j'ai remarqué que depuis ce tout petit bout de code, ça mettait plus de temps à se charger les pages :-s
est-ce que c'est le str_replace qui me ralentie à ce point ?


Pouf c'est tout !

Hors ligne

 

#8 21-07-2008 14:06:21

slaughter
Membre
Date d'inscription: 01-04-2008
Messages: 217

Re: Garder en mémoire l'url avant identification

Je suis débutant sur le ZF donc mal placé pour te dire ce qui ralenti le framework ou pas.
En tout cas, je pense que c'est un peu dommage de rajouter du code dans le bootstrap pour avoir une fonctionnalité qui n'est utile que sur une page (d'après ce que j'ai compris).

Hors ligne

 

#9 21-07-2008 14:23:39

Jocio
Membre
Lieu: Marseille
Date d'inscription: 06-07-2007
Messages: 42

Re: Garder en mémoire l'url avant identification

Je suis bien d'accord avec toi slaughter ...

Le problème, c'est que je vois pas où je peux mettre la sauvegarde de l'url autre part. Dès que le dispatch me redirige vers l'action login de account contrôleur, c'est mort ... :-s

Le truc, c'est que la 1ère condition de mon if est très restrictive, on entre dans la "if" que si l'utilisateur n'est pas connecté. Donc bon, ça rajoute du code mais il n'est pas exécuté bien souvent.

Mon ralentissement vient plutôt des sessions ... Le réseau est débordé en ce moment là où je bosse donc écrire sur le disque réseau, ça fait du mal à la performance de l'appli :-p


Pouf c'est tout !

Hors ligne

 

#10 21-07-2008 17:46:11

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

Re: Garder en mémoire l'url avant identification

dans le predispatch je fais ça

Code:

                if (!$this->_isAuthorized(true)) {
                    if (!$this->_isLogged(!true)) {
                        $this->_redirect('/login/auth/showLogin/?returnPath='.$returnPath);
                    } else {
                        $this->_redirect('/');
                    }
                }

pur cela j'ai une classe action dont tous mes controlleur dérivent et implémente la méthode _isLogged et _isAuthorized qui me retourne strue ou fals esi l'utilisateur est loggé ou pas et s'il est autorisé à exécuté la requête demandée.
le paramètre true permet de positionner un message dans la session qui sera affiché à l'utilisateur après le redirect. et $returnPath est le chemin de l'action demandée.
le module login affiche le formulaire et connecte l'utilisateur lorsque tout est OK il enchaine sur l'action demandée.
si le module est appelé sans action il va sur la page d'acceuil.
A+JYT

Hors ligne

 

#11 21-07-2008 20:51:40

Mat
Membre
Lieu: Clermont-Ferrand
Date d'inscription: 20-07-2008
Messages: 15
Site web

Re: Garder en mémoire l'url avant identification

Pour verifier les permissions de l'utilisateur, et le rediriger vers une page de login s'il n'est pas loggé, je te conseillerai de faire un Plugin que tu ajouterai a ton FrontController.
Si pour ton test tu veux juste savoir si l'utilisateur est authentifié, y'a moyen de faire un truc assez basique.

Dans ton bootstrap :

Code:

$frontController->registerPlugin(new My_Controller_Plugin_Acl());

Et la classe My_Controller_Plugin_Acl() ressemblerait a un truc dans le genre :

Code:

class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch($request)
    {
      $module = $request->getModuleName();
      $controller = $request->getControllerName();
      $action = $request->getActionName();

      if ($this->needLogin($module, $controller, $action) &&
      !Zend_Auth::hasIdentity())
    {
      $session = new Zend_Session_Namespace();
      $session->url_prec = str_replace($infosApp->baseurl,'',$_SERVER['REQUEST_URI']);

      $request->setModuleName('auth');
      $request->setControllerName('showLogin');
      $request->setActionName('index');
    }
    }

   protected function needLogin($module, $controller, $action)
   {
     // A faire
   }

}

Désolé si y'a des erreurs, c'est fait vite fait, mais le principe est là !
Fais gaffe aux boucles infinies de redirection smile


Après si tu veux un test plus évolué (si tu veux aller plus loin que le test "loggé"/"non loggé"), tu peux utiliser également Zend_Acl dans ce plugin.

Hors ligne

 

#12 22-07-2008 09:54:20

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

Re: Garder en mémoire l'url avant identification

lorsque j'ai fait mon truc je ne connaissais pas bien ZF et pas le mécanisme de plugin mais depuis je n'ai pas trouvé comment avec un plugin garder l'url demandé car l'idée cest que lorsque un utilisateur demande une url pour laquelle il doit être loggé et qu'il ne l'est pas on le loge et on lui donne ce qu'il a demandé.

en redéfinissant le rquest tu perds ce qui à été demandé du coup tu ne peux pas répondre à la demande de l'utilisateur.

il y a surement un moyen de modifier les params du request mais je ne me suis pas encore penché sur le sujet.
A+JYT

Hors ligne

 

#13 22-07-2008 16:45:40

Mat
Membre
Lieu: Clermont-Ferrand
Date d'inscription: 20-07-2008
Messages: 15
Site web

Re: Garder en mémoire l'url avant identification

Dans le plugin, avant de modifier $request, tu peux stocker ses valeurs actuelles pour les ressortir apres l'authentification.
Tu peux les stocker en session par exemple.

Edit:
Sinon mieux, plutôt que de s'encombrer avec une session, tu peux les passer en paramètre a ton controller/action qui s'occupe d'afficher le formulaire d'authentification.   Dans ce formulaire, tu incluera l'url de callback dans un champ hidden.

Pour modifier les params de la request dans le plugin :

Code:

$request->setParam('callbackUrl', $urlEnCours);

et pour le recuperer dans le controller :

Code:

if ($this->_hasParam('CallbackUrl'))
{
   $callbackUrl = $this->_getParam('CallbackUrl');

   // [...] Puis ajout de callbackUrl dans un champ hidden du formulaire d'authentification
}

Dernière modification par Mat (22-07-2008 18:59:21)

Hors ligne

 

#14 23-07-2008 09:35:53

Jocio
Membre
Lieu: Marseille
Date d'inscription: 06-07-2007
Messages: 42

Re: Garder en mémoire l'url avant identification

Ça m'a l'air super intéressant tout ce qui a été dit mais là je suis pressé par le temps sur mon projet et j'ai un truc qui marche donc bon ...
je me le note pour un prochain projet, mais là mon application n'est pas très grosse, donc ça gênera pas de garder le code que j'ai fait qui n'est pas très optimisé ...

merci beaucoup pour votre aide.


Pouf c'est tout !

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