Php 登录后是否将用户带回上一页?
我有一个名为Accounts的控制器,具有登录和注销视图 相应的函数如下所示: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
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());
}
}