Запретить вход в браузерную кнопку браузера после выхода из системы в Laravel 5

Я новичок в Laravel 5 и пытаюсь сделать простую страницу аутентификации. Моя проблема заключается в том, что я могу выйти из системы правильно после того, как я нажму ссылку на выход, но если я нажму кнопку "Назад" в браузере, все еще могу видеть содержимое страницы, которое на самом деле не следует рассматривать в отношении моего процесса промежуточного программного обеспечения. Я читаю, что могу предотвратить это, отключив кеширование, но не думаю, что это лучший способ сделать это, чтобы как можно улучшить это? Просто мой маршрут выхода

Route::get('logout', array('uses' => '[email protected]'));

Функция выхода:

public function logout() {
        Auth::logout(); // logout user
        Session::flush();
        Redirect::back();
        return Redirect::to('pages/login'); //redirect back to login
}

Ответ 1

Когда пользователь нажимает кнопку "Назад", они действительно не, а только браузер, отображающий то, что он кэшировал из предыдущих просмотров страниц. Пользователь не сможет перемещаться или взаимодействовать с чем-либо, что требует их входа в систему, потому что для вашего приложения на сервере они не аутентифицируются.

Когда пользователь нажимает кнопку назад, у вас нет контроля над этим как , он не делает запрос на сервер.

Используя кнопку "Назад", единственным контентом, который они смогут просмотреть, является то, что они уже посетили во время входа в систему. Если они попытаются получить доступ к чему-либо новому, они сделают новый запрос к вашему приложению, ваше промежуточное ПО вызовет и перенаправит их на страницу входа.

Я думаю, если бы вы действительно хотели остановить это поведение, вы могли бы использовать какой-то JavaScript и такой, чтобы отправить запрос ajax и проверить, зарегистрирован ли пользователь таким образом, но совершенно бесполезен с точки зрения безопасности.

Ответ 2

Это решение работает! Создайте промежуточное программное обеспечение, используя ремесленника.

php artisan make:middleware RevalidateBackHistory

В промежуточном программном обеспечении RevalidateBackHistory мы устанавливаем для заголовка значение no-cache и выполняем повторную проверку.

<?php
namespace App\Http\Middleware;
use Closure;
class RevalidateBackHistory
{
    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    * @return mixed
    */
    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

protected $routeMiddleware = [
    .
    .
    'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,
    .
    .
];

И это все! Поэтому в основном вам просто нужно вызвать revalidate middleware для маршрутов, которые требуют аутентификации пользователя.

Ответ 3

Шаг 1: создайте одно промежуточное программное обеспечение, используя следующую команду:

php artisan make:middleware PreventBackHistory

Шаг 2:

замените содержимое PreventBackHistory.php следующим содержимым:

<?php

namespace App\Http\Middleware;

use Closure;

class PreventBackHistory
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        return $response->header('Cache-Control','no-cache, no-store, max-age=0, must-revalidate')
            ->header('Pragma','no-cache')
            ->header('Expires','Sun, 02 Jan 1990 00:00:00 GMT');
    }
}

шаг 3: зарегистрировать промежуточное программное обеспечение в файле kernal.php

'preventBackHistory' => \App\Http\Middleware\PreventBackHistory::class,

И хорошо идти:)

Ответ 4

Метод, который я использовал, - просто перенаправить на предыдущую страницу после выхода из системы. Пока предыдущая страница была защищена, промежуточное программное обеспечение авторизации активируется и перенаправляет вас обратно на страницу входа. Теперь, когда вы нажимаете кнопку "Назад", предыдущая страница больше не кэшируется, и вы просто получаете страницу входа снова.

Исходное обсуждение: https://laracasts.com/discuss/channels/requests/back-button-browser

public function logout() {
        Auth::logout(); // logout user
        return redirect(\URL::previous());
}

Ответ 5

Попробуйте перенаправить на защищенный маршрут с помощью auth:

return redirect('home');

чтобы он перенаправлял страницу входа в систему, а кнопка "Назад" не отображает предыдущую страницу