Аутентификация Laravel на Backpaging через историю

У меня есть группа промежуточного программного обеспечения, определенная как:

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

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">
1

Другие решения

В большинстве случаев (если не во всех) нажатие кнопки «Назад» не запускает новый запрос, поэтому единственный способ реализовать «блокировку» будет на стороне клиента с помощью Javascript (или его разновидности).

Скорее всего, вы используете blade-сервер и мастер-макет, поэтому просто включите Javascript, который обнаруживает изменение окна на каждой странице вашего сайта. При (повторном) входе отключите Ajax-вызов на ваш сервер, который возвращает true / false в зависимости от состояния входа в систему. Если они не вошли в систему, используйте JS для перенаправления на страницу входа.

Следует отметить одну вещь: любой, кто знает JS, может легко обойти эту «проверку», но она послужит своей цели для большинства пользователей вашего сайта. К счастью, все это означает, что пользователь сможет увидеть страницу в точности так, как он ее увидел, прежде чем войти в систему. В этот момент никаких последствий для безопасности.

0

У меня такая же проблема.
Вы должны создать промежуточное программное обеспечение, которое перехватывает вызов страницы, очищая кеш

$ 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
});
0
По вопросам рекламы [email protected]