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

Php 登录后是否将用户带回上一页?,php,cakephp,redirect,login,cakephp-1.3,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"]); //redirec

我有一个名为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
它首先检查表单是否已提交
如果(!empty($this->data))
如果是,则将其登录,如果不是,则呈现signin表单。如果他们成功登录,我想将他们重定向到登录页面之前的页面

最好的方法是什么

编辑:

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


使用一个隐藏的
字段,该字段保存初始推荐人,并随登录数据一起提交。

我不知道最好的方法,但在将其重定向到登录页面之前,我将尝试的目的地存储在会话变量中


一旦他们登录,我将他们重定向到存储的目的地。

最好的方法是使用cakes Auth组件,让它做它所做的事情

以下是我如何使用referer

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

但问题是,如果用户输入的密码错误或输入的凭证无效,那么他将进入登录页面。如果他随后输入正确的用户名和密码,并使用
$this->referer()
进行重定向,在本例中,重定向本身就是重定向。然后用户可以选择1。重新重定向回登录页面或2。更糟糕的是,b/c登录会一直重定向到自身,从而陷入无限循环

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

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

现在,将要重定向的代码放在验证成功的代码部分(或者放在
if($this->Auth->user()){}
):

希望这对您有用。

这里是CakePHP 2.x

1.编辑AppController.php 只有当url不是/users/login(替换为您的登录url)并且没有用户登录时,才会存储用户在请求之前想要访问的url

2.编辑您的登录表单。我的是Users/login.ctp。仅当存在会话变量集时,才添加隐藏字段。 3.在登录操作中,添加一个操作以覆盖以前可能设置的LoginDirect变量。 }

我添加了一些安全检查,比如“重定向url是有效的url吗?”和“它是重定向到我的域还是外部域?”


注意:我知道检查
$\u服务器['HTTP\u HOST']
不是防弹的,但这里我们讨论的是防止打开重定向漏洞,所以这就足够了。

使用AppController和UsersController设置它

在AppController中执行过滤操作之前

$referer = Router::url($this->url, true);
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','?'=>['referer'=>$referer]);
用户控制器中的登录操作

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

从技术上讲,推荐人将始终是登录页面,因为他们进入
/signin
,然后提交登录表单。因此,在提交表单时,推荐人总是
/sign
。我想转到他们之前的位置。这有意义吗?
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)); }
}
    $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']);
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());
$referer = Router::url($this->url, true);
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','?'=>['referer'=>$referer]);
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());                 
 }
}