如何在登录后返回CakePHP中的referer页面

时间:2013-01-04 19:50:07

标签: cakephp authentication login session-variables referrer

我回到referer页面时遇到问题:

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操作中的凭据,我得到的是我以前的相同页面,现在我不能回到{ {1}}。

我通过在AppController中设置会话变量来尝试一些解决方案,该变量检查我是否在first url操作页面中并执行此操作:

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'], '/'))); } } 测试会话变量,在我转到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()); } } } } var得到:

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()视图页的最后一页的用户?

3 个答案:

答案 0 :(得分:15)

你试过这个:$this->redirect(Controller::referer());

我必须重新阅读您的整个问题,但这也应该有效:$this->redirect( $this->referer() );

答案 1 :(得分:11)

我使用会话来保持访问的最后一个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'));
    }
}

答案 2 :(得分:0)

我这样做:

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