Laravel认证通过历史背包


Laravel Authentication on Backpaging through History

我有一个中间件组定义为:

Route::group(['middleware' => 'auth'], function () {
    Route::get('home', 'Home@Redirect');
    Route::get('create','Create@Redirect');
    Route::get('settings', 'Settings@Redirect');
);

当有人注销时,我会将他们重定向到登录页面,然后调用Auth::Logout(),这很好,因为他们无法再浏览网站。

问题是,当你在浏览器历史记录中后退时,你可以在网站中向后导航,但如果他们点击链接试图在网站中导航,他们就会被踢出。

一个例子是,我在主页上,然后注销。我单击退格键,返回主页。然后我试着点击主页上的一个链接,要求我进行身份验证,我被踢了出去。。。但我不应该为了回到主页而回到我的历史。

如果这还不清楚,我可以进一步阐述或证明更多的代码。我在Laravel 5.0 上

这并不是Laravel的问题,只是网络浏览器的行为。

就像你提到的,注销后点击一个受保护页面的链接,会让你被拒绝访问,这意味着Laravel中间件可以完美工作。

我相信您可以通过使用JavaScript在客户端控制这种浏览器行为。

您可以更改所有限制区域的标题,通知浏览器内容不得缓存。

您可以将其添加到不希望缓存的所有页面的HTML头标记中。

 <meta http-equiv="cache-control" content="private, max-age=0, no-cache"> 
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="expires" content="0">

在大多数情况下(如果不是全部),按下后退按钮不会触发新的请求,因此实现"锁定"的唯一方法是在客户端通过Javascript(或其风格)。

很可能您使用的是刀片和主布局,所以只需包含一些Javascript,即可检测整个网站每个页面上的窗口变化。在(重新)输入时,向服务器发出Ajax调用,该调用根据服务器的登录状态返回true/false。如果他们没有登录,请使用JS重定向到登录页面。

需要注意的一点是:任何了解JS的人都可以很容易地绕过这个"检查",但它对你网站的大多数用户来说都是有用的。幸运的是,所有这些都意味着用户可以像登录前一样看到页面。在这一点上没有安全隐患。

我也遇到了同样的问题。您必须创建一个中间件来拦截页面调用,清除缓存

$ php artisan make:middleware RevalidateBackHistory

重写HANDLE 功能

public function handle($request, Closure $next)
    {
        $response = $next($request);
        return $response->header('Cache-Control','nocache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Fri, 01 Jan 1990 00:00:00 GMT');
    }

我将把它添加到数组$routeMiddleware 中的kernel.php中

'revalidate' => 'App'Http'Middleware'RevalidateBackHistory::class,

并将它们分组为

Route::group(['middleware' => 'revalidate'], function()
{
    // Routes that you want to revalidate go in here
});