Laravel 4.2 ajax请求循环在注销后将用户重新登录

时间:2015-09-30 18:16:39

标签: php jquery ajax laravel

我遇到了一个有趣的错误,需要一点点确定。

我们有一个相当标准的身份验证设置。

Auth :: check()查看他们是否已登录。如果是,请转到信息中心。如果不是,请将它们带到登录屏幕。

仪表板视图循环遍历几个ajax调用以填充仪表板的各个部分。我发现如果用户在ajax调用完成之前尝试注销,它们会被重定向回仪表板并仍然登录(我已经验证他们确实经历了注销过程并且Auth :: check()返回false )。

如果他们在ajax调用完成后尝试注销(或者我禁用了ajax调用),它会按预期工作,并且会被注销并重定向到登录屏幕。

基本结构是:

routes.php文件

Route::get('/', array('as' => 'home', 'uses' => 'HomeController@getIndex'));

Route::get('/login', array('as' => 'login', 'uses' => 'AuthController@getLogin'))->before('guest');
Route::post('/login', array( 'uses' => 'AuthController@postLogin'))->before('csrf');

Route::get('/logout', array('as' => 'logout','uses' => 'AuthController@getLogout'))->before('auth');

Route::get('/dashboard', array('as' => 'dashboard', 'uses' => 'DashboardController@getIndex'))->before('auth');
Route::post('/dashboard/panel', array('as' => 'getPanelData', 'uses' => 'DashboardController@getDashboardPanelData'))->before('auth');
/* /dashboard/panel is what recieves the ajax call data and returns the result */

HomeController.php

class HomeController extends BaseController {

    public function getIndex()
    {       
        if(Auth::check()) {
            return Redirect::route('dashboard');
        } else {
            Session::flush();
            return Redirect::route('login');
        }       
    }

}

DashboardController.php

public function getIndex() {
    return View::make('layouts.dashboard.index');
}

public function getDashboardPanelData() {
   // gets data from ajax call and returns a result
}

我已经想到了几个解决方案,一个是点击退出按钮时杀死任何未完成的ajax请求,或者从面板路径中删除auth过滤器,但我不确定第一个是不是一个好主意从安全角度来看,我对后者持谨慎态度。

编辑:

您可以忽略所有这些中的循环部分。即使我取出循环并且只运行一个ajax调用,如果我在ajax调用的中间注销,我仍然会遇到它退出并重新登录的问题。

ADD。编辑:

我尝试删除/ dashboard /面板上的auth过滤器,但它无法解决问题。

编辑:

这是auth过滤器,非常标准。

Route::filter('auth', function()
{
    if (Auth::guest()) return Redirect::guest('login');
});

部分解决方案: 就我而言,仪表板面板不需要经过身份验证的用户访问。我所做的是检查会话配置中的路径,如果它与仪表板面板匹配,请将会话驱动程序更改为数组(不会重写文件会话,从而允许完全注销)。

在session.php中:

'driver' => Request::path() === 'dashboard/panel' ? 'array' : 'file',

同样,对所有人来说,这不是一个理想的解决方案,但就我而言,这已经足够了。

1 个答案:

答案 0 :(得分:1)

Ajax调用应返回401状态代码(未授权)。将事件处理程序附加到文档并重定向到登录页面:

$(document).ajaxError(function(event, xhr, settings, thrownError) {
    if(xhr.status == "401") {           
        window.location.href = "/login";        
     }  
});

编辑:路由过滤器示例:

Route::filter('auth', function() {   
    if (Auth::guest())  {
        if (Request::ajax()) {          
            return Response::json('permission_denied', 401);
        }
        else {
            return Redirect::guest('login');
        }
     }    
});