为什么在laravel中按下浏览器的后退按钮时过滤器不起作用?

时间:2014-05-28 15:39:07

标签: php authentication browser laravel laravel-4

我可以输入一个帐户,然后调用数据验证的控制器,然后使用身份验证方法保存

    public function doLogin(){
    $rules = array(
                    'email' => 'required|email',
                    'password' => 'required'
                    );

    $validator = Validator::make(Input::all(), $rules);
    //dd(Input::all());

    if($validator->fails()){
        return Redirect::to('usuarios')->withErrors($validator)->withInput(Input::except('password'));
    }else{

        $userdata = array(
            'email' => Input::get('email'),
            'password' => Input::get('password')
            );

        if(Auth::attempt($userdata)){
            return View::make('principal');
        }else{

            return Redirect::to('usuarios');
        }

    }
}

我还有退出会话的功能

Route::get('usuarios/logout', function(){
        Auth::logout();
        return Redirect::to('usuarios'); //login page
})->before('auth');

问题在于,当我按下浏览器的后退按钮时,我可以毫无问题地使用应用程序但没有身份验证。

路线

Route::get('usuarios', function(){
return View::make('login');
})->before('guest');

Route::get('usuarios/view', function(){
    $usuarios = Usuario::paginate(5);
    return View::make('viewusuario', array('usuarios' => $usuarios));
})->before('auth');

Route::get('usuario/create', function(){
    return View::make('formusuario');
})->before('auth');

过滤

Route::filter('auth', function()
{
    if (Auth::guest()) return Redirect::guest('usuarios'); //login page
});
Route::filter('guest', function()
{
    if (Auth::check()){
        return View::make('principal'); //home page     
    }
});

我该如何解决?

2 个答案:

答案 0 :(得分:6)

问题与浏览器缓存有关,而与Laravel无关。

要处理浏览器缓存,您可以在启动文件服务提供商中使用以下代码:

App::after(function($request, $response)
{
    $response->headers->set('Cache-Control','nocache, no-store, max-age=0, must-revalidate');
    $response->headers->set('Pragma','no-cache');
    $response->headers->set('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
});

这里我们只是使用application events修改Laravel中的每个回复。


有些人说这适用于所有网络浏览器,但不适用于IE浏览器。因此,对于IE,您应该在布局中添加一堆元标记:

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="no-store" />
<meta http-equiv="cache-control" content="must-revalidate" />
<meta http-equiv="expires"       content="0" />
<meta http-equiv="expires"       content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma"        content="no-cache" />

答案 1 :(得分:0)

问题在于浏览器缓存,当你返回时,浏览器不会查询所有内容,为了加快速度,它只是从缓存中加载页面。但是,当您重新加载该页面ctrl + r时,它将无效。你可以像其他人在这里说的那样禁用页面缓存,但是如果你在云托管上,它会花费你网站的性能和更多账单。所以缓存很好,保留它。

您应该尝试对需要auth过滤器的所有网页进行分组,这样您就不会忘记添加该过滤器,我们都是人,有时我们会忘记。

Route::group(['before' => 'auth', function(){
    Route::get('usarios/view', function() { ... });
    Route::get('usarios/create', function() { ... });
}]);

Route::group(['before' => 'guest', function(){
    Route::get('usarios/login', 'AuthController@showLogin');
    Route::post('usarios/login', 'AuthController@doLogin');
}]);

此外,尝试不在登录post中显示主用户页面,例如doLogin。您应该将用户重定向到显示用户主页的新页面。