2013-01-04 21 views
7

Ho un problema di tornare alla pagina referer:Come tornare alla pagina referer in CakePHP dopo il login

first url: http://site.com/venue/apartments/1564/venue-name 
referer url: null 

In questa pagina posso modificare roba dentro, quindi ho un tasto login per andare a la pagina di accesso, dopo un login riuscito, vorrei tornare allo first url.

second url: http://site.com/users/login 
referer url: http://site.com/venue/apartments/1564/venue-name 

quando provo ad accedere, a causa delle regole di azione CakePHP, devo aggiornare la pagina di login per controllare le credenziali, le problem inizia da qui:

third url: http://site.com/users/login 
referer url: http://site.com/users/login 

aggiornando la pagina, e controllando le credenziali nell'azione-del controller users ottengo come riferimento la stessa pagina in cui ero prima, e ora non posso tornare allo first url.

ho cercato qualche soluzione impostando una variabile di sessione nel AppController che verifica se non sono nella pagina delle azioni login e facendo questo:

AppController.php 

public function beforeFilter() { 
    $this->setRedirect(); 
} 

public function setRedirect() { 
    if ($this->request->params['controller'] != 'users' && $this->request->params['action'] != 'login') { 
     $this->Session->write('redir', array('controller'=>$this->request->params['controller'], 'action'=>$this->request->params['action'], implode($this->request->params['pass'], '/'))); 
    } 
} 

Testando la sessione var con debug($this->Session->write('redir')); tutto sembrerebbe funziona perfettamente fino a quando vado al login azione:

UsersController.php 

public function login() { 
    if ($this->request->is ('post')){ 
     if ($this->Auth->login()) { 
      $redir = $this->Session->read('redir'); 
      if (!empty($redir)) { 
       $this->redirect ($redir); 
      } else { 
       $this->redirect ($this->Auth->redirect()); 
      } 
     } 
    } 
} 

In questo modo si rompe l'applicazione e se mi debug($redir); var ottengo:

array(
    'controller' => 'js', 
    'action' => 'jquery', 
    (int) 0 => 'plugin/jquery.validata.1.7.min' // just a jquery plugin loaded in default.ctp 
) 

invece di

array(
    'controller' => 'venue', 
    'action' => 'apartments', 
    (int) 0 => '1564/venue-name' 
) 

Se debug($redir); in qualsiasi altra vista di tutto il sito, tutto funziona bene e ottengo i dati giusti.

Ho pensato a una sorta di routine di protezione sessione per l'azione $this->Auth->login() ma per me è totalmente privo di senso.

Come posso semplicemente reindirizzare l'utente registrato all'ultima pagina che non è la pagina di visualizzazione login?

+0

Quindi, ciò che si vuole fare è reindirizzare l'utente al form di login quando cercano di accedere una pagina che richiede l'autenticazione e quindi reindirli a quella pagina quando l'autenticazione ha esito positivo? –

+0

sì, è, non ho trovato un modo giusto per farlo. – vitto

+0

Suppongo che tu sappia che il componente 'Auth' ha questa funzionalità integrata. Basta fare' $ this-> reindirizzare ($ this-> Auth-> redirect()); 'all'interno di' if ($ this-> Auth-> login()) {'block. C'è una ragione per cui non lo stai facendo? – Nick

risposta

15

Hai provato: $this->redirect(Controller::referer());?

avrei dovuto rileggere tutta la vostra domanda per essere sicuro, ma questo dovrebbe anche funzionare: $this->redirect($this->referer());

11

ho usato le sessioni per mantenere l'ultimo URL accessibili e se l'accesso riesce l'utente verrà reindirizzato ad esso .

Prima in AppController.php ho salvare in seduta l'url, ad eccezione di login e logout azioni:

public function beforeFilter() { 
    $url = Router::url(NULL, true); //complete url 
    if (!preg_match('/login|logout/i', $url)){ 
     $this->Session->write('lastUrl', $url); 
    } 
} 

Nel UserController.php per l'azione di login Ho il seguente codice:

public function login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      if ($this->Session->read('lastUrl')){ 
       $this->redirect($this->Session->read('lastUrl')); 
       exit; 
      }else{ 
       return $this->redirect($this->Auth->redirect()); 
      } 
     } 
     $this->Session->setFlash(__('Invalid username or password')); 
    } 
} 
0

lo faccio proprio come questo:

public function login() { 
    if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      $this->redirect($this->Session->read('referer')); 
     } else { 
      $this->Session->setFlash(__('Não foi possível efetuar o login. Usuário ou senha inválidos'), 'default', array('class' => 'alert alert-danger')); 
     } 
    } else { 
     $this->Session->write('referer', $this->referer()); 
    } 
} 
Problemi correlati