登录后将用户带回上一页?

时间:2011-01-25 15:37:15

标签: php cakephp redirect login cakephp-1.3

我有一个名为Accounts的控制器,其中包含注册和注销视图。

相应的功能如下所示:

function signin()
{
    if (!empty($this->data)) 
    {
        //handle login
        ...
        //save login to session
        $this->Session->write('Account',  $data["Account"]);
        //redirect to previous page
        ???
    }
}

function signout()
{
    //delete login
    $this->Session->delete('Account');
    //redirect to previous page
    ??? 
}

如果用户转到accounts/signin,则首先检查表单是否已提交if(!empty($this->data)),如果是,则将其记录下来,否则会呈现登录表单。如果他们成功登录,我想将他们重定向到登录页面之前的页面。

最好的办法是什么?

修改

我认为我不能使用常规的http推荐人,因为从技术上讲,推荐人将始终是登录页面,因为他们转到/signin,然后提交登录表单。因此,在提交表单时,引荐者始终为/signin。我想重定向到他们之前的位置。这有意义吗?

6 个答案:

答案 0 :(得分:2)

最好的方法是使用cake Auth组件并让它做它的功能...... http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#AuthComponent::$loginRedirect

答案 1 :(得分:2)

以下是我使用referer

的方式

我有2个登录表单,一个是所有页面顶部的表单,可以轻松登录,另一个是登录操作。如果用户使用顶部的表单,表单提交然后转到登录页面,您可以使用$this->referer()重定向用户。

但问题是,如果用户输错密码或输入无效凭证,他将最终登录登录页面。如果他然后输入正确的用户名+密码,则使用$this->referer()进行重定向,在这种情况下就是自己。然后,用户可以1.再次重定向回登录页面或2.更糟糕的是可能陷入无限循环b / c登录将继续重定向到自身。

所以,我添加一些逻辑来检查以确保referer不是登录页面。此外,我在用户第一次登录登录页面时添加了另一个存储$this->referer()的逻辑,我们知道登录页面之前页面的确切位置。

要在登录页面之前存储页面,请将此代码放在操作的末尾(登录视图呈现即将开始)

//get the current url of the login page (or current controller+action)
$currentLoginUrl = strtolower( "/" .$this->name ."/" .$this->action );
if( $this->referer() != $currentLoginUrl  )
{
    //store this value to use once user is succussfully logged in
    $this->Session->write('beforeLogin_referer', $this->referer($this->Auth->redirect(), true)) ) ;  //if referer can't be read, or if its not from local server, use $this->Auth->rediret() instead
}

现在将代码重定向到代码中成功进行身份验证的部分(或if( $this->Auth->user() ){ }中):

//get the login page url again (by gettting its controller, or plural of Model, and this current page action and make the url)
$currentLoginUrl = strtolower( "/" .$this->name ."/" .$this->action );

//if the referer page is not from login page, 
if( $this->referer() != $currentLoginUrl  )
{
    //use $this->referer() right away
    $this->redirect($this->referer($this->Auth->redirect(), true));  //if referer can't be read, or if its not from local server, use $this->Auth->rediret() instead
}
else
{
    //if the user lands on login page first, rely on our session 
    $this->redirect( $this->Session->read('beforeLogin_referer') );
}

希望这适合你。

答案 2 :(得分:1)

http://book.cakephp.org/view/430/referer

使用包含初始引荐来源的隐藏<input>字段,并使用登录数据提交。

答案 3 :(得分:1)

我不知道最好的方法,但是我将尝试的目的地存储在会话变量中,然后将它们重定向到登录页面。

登录后,我会将其重定向到存储的目的地。

答案 4 :(得分:0)

CakePHP 2.x在这里

1。编辑AppController.php

public function beforeFilter() {
        // redirect url
        if($this->request->here!= '/users/login') {
            $user_id = AuthComponent::user('id');
            if(empty($user_id)) { $this->Session->write('redirect_url_after_login', Router::url($this->request->here, true)); }
}

这将存储用户在请求之前想要去的网址,仅当网址不是/ users / login(用您的登录网址替换)并且没有用户被记录时。

2。编辑您的登录表单。我的是Users / login.ctp。仅当存在会话变量时才添加隐藏字段。

    $redirect_url_after_login = $this->Session->read('redirect_url_after_login');
    if(!empty($redirect_url_after_login))
        echo $this->Form->input('redirect_url_after_login', ['value'=>$redirect_url_after_login, 'type'=>'hidden']);

3。在您的登录操作中,添加一个操作以覆盖您之前可能设置的loginRedirect变量。

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            $redirect_url_after_login = $this->request->data['User']['redirect_url_after_login'];
            if(!empty($redirect_url_after_login)
                &&filter_var($redirect_url_after_login, FILTER_VALIDATE_URL)
                &&parse_url($redirect_url_after_login, PHP_URL_HOST)==$_SERVER['HTTP_HOST'])
                    return $this->redirect($redirect_url_after_login);
            $this->Session->delete('redirect_url_after_login');
            return $this->redirect($this->Auth->redirect());

}

我添加了几个安全检查,比如&#34;重定向网址是一个有效的网址?&#34;和#34;它是重定向到我的域名还是外部域名?&#34;。

注意:我知道检查$_SERVER['HTTP_HOST']不是防弹的,但我们在这里谈论的是防止开放式重定向漏洞,所以它已经足够了。

答案 5 :(得分:0)

使用AppController和UsersController进行设置

在AppController中 beforeFilter操作

$referer = Router::url($this->url, true);
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','?'=>['referer'=>$referer]);

在UsersController中登录操作

if($this->Auth->login())
{
 $this->Session->setFlash(__('Logged in successfully !'));
$redirect = $this->request->query('referer');
if(!empty($redirect))
 {
   return $this->redirect($this->Auth->redirectUrl($redirect));
 }else{
    return $this->redirect($this->Auth->redirectUrl());                 
 }
}