Как вернуться на страницу реферера в CakePHP после авторизации

У меня проблема с возвратом на страницу реферера:

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

На этой странице я могу редактировать вещи внутри, поэтому у меня есть login чтобы перейти на страницу входа в систему, после успешного входа в систему я хотел бы вернуться к first url,

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

когда я пытаюсь войти в систему, из-за правил действия CakePHP, я должен обновить страницу входа в систему, чтобы проверить учетные данные, problem начинается здесь:

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

обновив страницу и проверив учетные данные в login действие users контроллер, который я получаю, ссылаясь на ту же страницу, где я был раньше, и теперь я не могу вернуться к first url,

Я попытался какое-то решение, установив переменную сеанса в AppController, который проверяет, если я не в login Действие страницы и делать это:

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

Тестируя сессию var с debug($this->Session->write('redir')); Казалось бы, все работает идеально, пока я не иду к 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());
            }
        }
    }
}

Делая это сломать приложение, и если я debug($redir); вар я получаю:

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

вместо

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

Если я debug($redir); в любом другом представлении всего сайта все работает хорошо, и я получаю правильные данные.

Я думал в какой-то процедуре защиты сессии для $this->Auth->login() действие, но это полная чушь для меня.

Как я могу просто перенаправить пользователя, вошедшего на последнюю страницу, которая не является login Просмотр страницы?

3 ответа

Вы пробовали это: $this->redirect(Controller::referer());?

Я должен был бы перечитать весь ваш вопрос, чтобы быть уверенным, но это также должно работать: $this->redirect( $this->referer() );

Я использовал сеансы, чтобы сохранить последний URL-адрес, и если вход в систему будет успешным, пользователь будет перенаправлен на него.

Сначала в AppController.php я сохраняю в сессии URL-адрес, за исключением действий входа и выхода:

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

В UserController.php для действия входа в систему у меня есть следующий код:

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

Я делаю это просто так:

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());
    }
}
Другие вопросы по тегам