我遇到了一个有趣的错误,需要一点点确定。
我们有一个相当标准的身份验证设置。
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',
同样,对所有人来说,这不是一个理想的解决方案,但就我而言,这已经足够了。
答案 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');
}
}
});