2013-01-04 11 views
7

mam problem na powrót do strony odsyłający:Jak wrócić do strony odsyłający w CakePHP po zalogowaniu

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

Na tej stronie można edytować rzeczy w środku, więc mam login przycisk, aby przejść do stronę logowania, po pomyślnym zalogowaniu, chciałbym wrócić do first url.

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

gdy próbuję się zalogować, ze względu na zasady działania CakePHP, muszę odświeżyć stronę logowania do sprawdzenia poświadczenia, że ​​problem zaczyna się tutaj:

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

odświeżając stronę, a sprawdzanie poświadczeń w sterowniku login sterownika users otrzymuję jako odsyłającą tę samą stronę, na której byłem wcześniej, i teraz nie mogę wrócić do first url.

Próbowałem jakieś rozwiązanie przez ustawienie zmiennej sesji w AppController który sprawdza, czy nie jestem na stronie akcji login i robi to:

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'], '/'))); 
    } 
} 

Testując var sesji z debug($this->Session->write('redir')); wszystko wydaje się działa idealnie, dopóki nie iść do działania login:

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()); 
      } 
     } 
    } 
} 

Spowoduje to przerwać stosowanie i gdybym debug($redir); var uzyskać:

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

zamiast

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

Gdybym debug($redir); w każdym innym widoku całej strony, wszystko działa dobrze i uzyskać odpowiednie dane.

Pomyślałem o czymś w rodzaju rutynowej ochrony sesji dla akcji $this->Auth->login(), ale dla mnie to kompletnie nonsens.

Jak mogę po prostu przekierować użytkownika zalogowanego na ostatnią stronę, która nie jest stroną widoku login?

+0

Więc, co chcesz zrobić, to przekierowanie użytkownika do formularza logowania, gdy próbują uzyskać dostęp stronę, która wymaga auth, a następnie przekierowanie do tej strony, gdy auth się powiedzie? –

+0

tak, to jest, nie znalazłem odpowiedniego sposobu na zrobienie tego. – vitto

+0

Zgaduję, że wiesz, że komponent 'Auth' ma wbudowaną tę funkcję. Po prostu wykonaj' $ this-> redirect ($ this-> Auth-> redirect()); 'wewnątrz' if ($ this-> Auth-> login()) {'blok. Czy istnieje powód, dla którego tego nie robisz? – Nick

Odpowiedz

15

Czy próbowałeś tego: $this->redirect(Controller::referer());?

musiałbym ponownie przeczytać cały pytanie, aby mieć pewność, ale to powinno również pracować: $this->redirect($this->referer());

11

użyłem sesje zachować ostatni url dostępne i jeśli logowanie się powiedzie użytkownik zostanie przekierowany do niego .

pierwsze w AppController.php zapisać w sesji URL, z wyjątkiem logowania i wylogowania czynności:

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

W UserController.php do działania logowania Mam następujący kod:

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

robię to właśnie tak:

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()); 
    } 
} 
Powiązane problemy