У меня есть группа промежуточного программного обеспечения, определенная как:
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 (или его разновидности).
Скорее всего, вы используете blade-сервер и мастер-макет, поэтому просто включите 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');
}
Я добавлю его в kernel.php в массиве $ routeMiddleware
'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
и сгруппировать их
Route::group(['middleware' => 'revalidate'], function()
{
// Routes that you want to revalidate go in here
});