Выход из Laravel, нажатие кнопки «Назад» отправляет меня обратно в приложение, как мне предотвратить это

В настоящее время я использую контроллеры входа/аутентификации laravel по умолчанию, маршруты, представления и не использую пользовательскую логику. Мы создаем приложение, в котором, если вы выйдете из системы и нажмете кнопку «Назад», вы не сможете ни при каких обстоятельствах «вернуться обратно в приложение, даже если у вас нет сеанса».

Есть ли способ, чтобы кнопка «Назад» при нажатии после выхода из системы не возвращала вас обратно в приложение? Как будто мы ничего не можем показать, как только вы нажмете кнопку «Назад». Он должен попасть на экран ошибки laravel или автоматически отправить вас обратно для входа в систему.

Все мои контроллеры имеют $this->middleware('auth');, который автоматически возвращает вас на экран входа в систему.


person TheWebs    schedule 24.01.2020    source источник
comment
Вам необходимо запретить кеширование браузера (для страниц, которые необходимо сохранить приватными) и/или удалить историю. Очистить историю можно только с помощью javascript, поэтому это будет означать отправку некоторого кода со страницей подтверждения выхода.   -  person Snapey    schedule 25.01.2020
comment
@Snapey Можете ли вы дать правильный ответ с примером решения, чтобы я мог отметить его как принятое и понять, о чем вы говорите? Это звучит как правильный пример.   -  person TheWebs    schedule 26.01.2020
comment
После некоторых экспериментов можно перенаправить пользователя на страницу «выход из системы» и на этой странице заменить последний элемент в истории на ту же страницу. Не представляется возможным удалить более ранние записи в истории, поэтому, пока пользователь не может нажать кнопку «Назад», он может, удерживая кнопку «Назад», выбрать любую из предыдущих страниц.   -  person Snapey    schedule 26.01.2020
comment
@Snapey, большинство наших клиентов не настолько технически подкованы, чтобы удерживать кнопку «Назад», чтобы выбрать страницу.   -  person TheWebs    schedule 26.01.2020


Ответы (3)


Если вы просто хотите предотвратить использование кнопки «Назад» и на самом деле не заботитесь о том, чтобы пользователь мог удерживать кнопку «Назад» и переходить на более ранние страницы, тогда следующее отключает кнопку «Назад».

(конечно, вы можете использовать как отключить кеш, так и отключить кнопку «Назад»)

Создайте новое представление «Вышел из системы»

Это необязательно, но означает, что вы можете добавить javascript, не беспокоясь о том, что это повлияет на другие функции.

@extends('layouts.app',[$title='Logout | '])

@section('content')
<div class="container mx-auto">
    <div class="flex flex-wrap justify-center">
        <div class="w-full max-w-md">

            <h1 class="text-2xl text-gray-700 text-center">You have been successfully logged out</h1>

            <p class='mt-8 text-xl text-indigo-800 text-center underline'><a href="{{ route('login') }}">Login?</a></p>

            <script type="text/javascript">
                history.pushState(null, null, `{{ route('logout') }}`);
                window.addEventListener('popstate', function () {
                    history.pushState(null, null, `{{ route('logout') }}`);
                });
            </script>

        </div>
    </div>
</div>
@endsection

Создайте маршрут для отображения страницы выхода

Route::view('/logout','auth.logout')->name('logout');

Измените контроллер входа в систему, чтобы перейти к представлению выхода из системы.

Добавьте следующий код где-нибудь внутри App\Http\Controllers\Auth\LoginController.php

    private function loggedOut($request)
    {
        return redirect(route('logout'));
    }
person Snapey    schedule 27.01.2020

После долгих тестов я обнаружил, что единственным решением является принудительное использование заголовка no store для ответа всех «защищенных» страниц, чтобы браузер не кэшировал его. В медленных сетях это может добавить небольшую задержку к загрузке страницы. Это влияет только на возвращаемый ответ, никакие ресурсы, загружаемые страницей, не затрагиваются. Их еще можно кэшировать.

Создайте новое промежуточное ПО с помощью php artisan make:middleware NoCacheHeaders

Отредактируйте, как предложено ниже

<?php

namespace App\Http\Middleware;

use Closure;

class NoCacheHeaders
{
    /**
     * Add set no caching HTTP headers.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|array  $options
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \InvalidArgumentException
     */
    public function handle($request, Closure $next, $options = [])
    {
        $response = $next($request);

        $response->header('Expires', 'Fri, 01 Jan 1990 00:00:00 GMT');
        $response->header('Cache-Control', 'no-cache, must-revalidate, no-store, max-age=0, private');

        return $response;
    }

}

Добавьте это промежуточное ПО в \App\Http\Kernel.php в разделе routeMiddleware

        'nocache' => \App\Http\Middleware\NoCacheHeaders::class,

ПО промежуточного слоя nocache теперь можно добавлять к группам или отдельным маршрутам. Добавляю ко всем маршрутам, защищенным auth

//protected routes (must be logged in)
Route::middleware(['auth','nocache'])->group(function(){

    Route::get('/home', 'HomeController@index')->name('home');

    Route::name('admin.')->group(function () {
        Route::resource('admin/users','Admin\UserController');
        Route::resource('admin/roles','Admin\RoleController');
    });

});

Теперь после просмотра защищенных страниц, выхода из системы и возвращения обратно предыдущие страницы не раскрываются.

person Snapey    schedule 26.01.2020

вы можете легко направить весь трафик через промежуточное ПО аутентификации в классе маршрута, используя группу маршрутов:

Auth::routes(); // exclude auth route from being guarded

Route::group(['middleware' => 'auth'], function()
{
    // add all your routes here
   Route::get('/',function (){
          return view('welcome);
   });
});

Редактировать 1: Чтобы запретить пользователю использовать кешированную версию, ознакомьтесь с этой статьей https://twitteinfo.com/laravel-5-how-to-prevent-browser-back-button-after-user-logout/

person Mohamed-Foly    schedule 25.01.2020
comment
Почему $this-›middleware(‘auth’) во всех контроллерах не делает это автоматически? - person TheWebs; 25.01.2020
comment
оба способа хороши и дают одинаковый результат, но различаются, когда проверка происходит в жизненном цикле запроса. перед загрузкой контроллера (в пути), во время загрузки контроллера (в конструкторе). оба будут перенаправлены на вход в систему, если пользователь попытается получить доступ к маршруту - person Mohamed-Foly; 25.01.2020
comment
К сожалению, это не мешает браузеру просто показывать содержимое из своего кеша без ссылки на сервер. - person Snapey; 26.01.2020
comment
Я думаю, что эта статья будет полезна twitteinfo.com/ - person Mohamed-Foly; 27.01.2020