2010-01-20 3 views

Répondre

2

Stockez la page avant de vous connecter à une session, après vous être connecté, lisez l'URL de la page précédente et redirigez l'utilisation vers cette page.

+0

Il peut être utile de tester si vous placez une condition quelque part pour empêcher votre code d'essayer de rediriger vers la page d'où vous venez. Si vous voyez une erreur de redirection dans votre navigateur, la condition peut le corriger. – berty

1

Vous pouvez transmettre l'URL "return" en tant que paramètre à la page de connexion. c'est-à-dire http://yourserver.com/login/?return=http%3a%2f%2fyourserver.com%2fsomedir%2fsomething%2f. Après une connexion réussie, vous utilisez le paramètre get pour rediriger en utilisant un simple en-tête HTTP location:http://yourserver.com/somedir/something/.

Ceci est, par exemple, pratiqué dans différents services Google et Microsoft où il y a une seule page pour la signature de services et différents qui obligent l'utilisateur à loogged dans.

+0

Ceci est (imho) dangereux car l'URL peut être modifiée. C'est à dire. un utilisateur obtient un lien vers une URL apparemment MS (contient www.microsoft.com), se connecte et est redirigé vers une URL malveillante qui ressemble à une page Microsoft. Rediriger au referer est presque aussi dangereux, la seule façon sûre (pour l'utilisateur) est de stocker l'URL appelé à l'origine une redirection vers elle: Tous Page: si {StoreUrl (CURRENTURL (user.IsLoggedIn!)) RedirectTo ("connexion"); } Connexion: if (LoginSuccessfull()) {RedirectTo (GetStoredUrl()); } – dbemerlin

+0

D'accord avec cela. En fait, la page de connexion devrait valider le chemin "retour" s'il s'agit d'une origine connue. – naivists

1

Vous pouvez cette utilisation aide d'action, j'ai écrit il y a quelque temps. À votre santé!

class Your_Controller_Action_Helper_GoBack 
extends Zend_Controller_Action_Helper_Abstract 
{ 
    /** 
    * @todo Check if redirecting to the same domain 
    * @param bool $required Throw exception? 
    * @param bool $validateDomain 
    * @param bool $allowSubdomain 
    * @param string $alternative URL to redirect to when validation fails and required = true 
    * @param string $anchorParam Request parameter name which holds anchor name (#). Redirect to page fragment is not allowed according to HTTP protocol specification, but browsers do support it 
    * @throws Zend_Controller_Action_Exception if no referer is specified and $required == false or $checkdomain is true and domains do not match 
    */ 
    public function direct($required = true, $anchorParam = null, $validateDomain = true, $allowSubdomain = false, $alternative = null) 
    { 
    $front = Zend_Controller_Front::getInstance(); 
    $request = $front->getRequest(); 

    $referer = $request->getPost('http_referer'); 

    if (empty($referer)) { 
    $referer = $request->getServer('HTTP_REFERER'); 
    if (empty($referer)) { 

    $referer = $request->getParam('http_referer'); 

    } 
    } 

    if (null === $alternative) { 
    $alternative = $request->getPost('http_referer'); 
    if (null === $alternative) { 
    $alternative = $request->getParam('http_referer'); 
    } 
    } 

    if ($referer) { 

    if ($validateDomain) { 
    if (!$this->validateDomain($referer, $allowSubdomain)) { 
     $this->_exception($alternative); 
    } 
    } 

    if (null != $anchorParam) { 
    $referer .= '#' . $request->getParam($anchorParam); 
    } 

    $redirector = new Zend_Controller_Action_Helper_Redirector(); 
    $redirector->gotoUrl($referer); 
    } elseif($required) { 
    $this->_exception($alternative); 
    } 
    } 

    /** 
    * @throws Zend_Controller_Action_Exception With specified message 
    * @param string $message Exception message 
    * @param string $alternative 
    */ 
    private function _exception($alternative = null, $message = 'HTTP_REFERER is required.') 
    { 
    if ($alternative) { 
    if (Zend_Uri::check($alternative)) { 
    $redirector = new Zend_Controller_Action_Helper_Redirector(); 
    $redirector->gotoUrl($alternative); 
    } 
    } 

    throw new Zend_Controller_Action_Exception($message); 
    } 


    /** 
    * Check if domain from current url and domain from specified url are the same 
    * @param string $url Target url 
    * @param string $allowSubdomain false 
    */ 
    public function validateDomain($url, $allowSubdomain = false) 
    { 
    if (!Zend_Uri::check($url)) { 

    return false; 
    } 

    $currentUri = $this->getCurrentUri(); 

    $uri = Zend_Uri_Http::fromString($currentUri); 
    $currentDomain = $uri->getHost(); 

    $uri = Zend_Uri_Http::fromString($url); 
    $target = $uri->getHost(); 

    if ($allowSubdomain) { 
    // Find second dot from the end 
    $pos = strrpos($target, '.'); 

    if (false !== $pos) { 
    $pos = strrpos(substr($target, 0, $pos), '.'); 

    if (false !== $pos) { 
     $target = substr($target, $pos+1); 
    } 
    } 
    } 

    if ($target === $currentDomain) { 
    return true; 
    } 

    return false; 
    } 

    /** 
    * @return string Current URL 
    */ 
    public function getCurrentUri() 
    { 
    $request = $this->getRequest(); 
    $path = $request->getRequestUri(); 

    $server = $request->getServer(); 

    $host = $request->getServer('HTTP_HOST'); 
    $protocol = $request->getServer('SERVER_PROTOCOL'); 

    if (!empty($protocol)) { 
    $protocol = explode('/', $protocol); 
    $protocol = strtolower($protocol[0]); 
    } 

    if (empty($protocol)) { 
    $protocol = 'http'; 
    } 

    $baseUrl = $protocol . '://' . $host . '/'; 

    $path = trim($path, '/\\'); 

    $url = $baseUrl . $path; 

    return $url; 
    } 

    /** 
    * Like str_replace, but only once 
    * @param string $search 
    * @param string $replace 
    * @param string $subject 
    */ 
    public function replaceOnce($search, $replace, $subject) 
    { 
    $firstChar = strpos($subject, $search); 
    if($firstChar !== false) { 
    $beforeStr = substr($subject, 0, $firstChar); 
    $afterStr = substr($subject, $firstChar + strlen($search)); 

    return $beforeStr . $replace . $afterStr; 
    } else { 

    return $subject; 
    } 
    } 
} 
Questions connexes