我有一个中间件组定义为:
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
});