Laravel 注销,点击后退按钮让我回到应用程序,我该如何防止这种情况

Laravel logout, hittin gthe back button send s me back into the app, how do I prevent this

目前我使用默认的 laravel login/auth 控制器、路由、视图并且没有自定义逻辑。我们正在构建一个应用程序,如果您注销并单击后退按钮,在任何情况下都不能 "be taken back into the app, even if you have no session."

有没有办法在您注销后点击后退按钮,而不是让您返回应用程序?就像您单击后退按钮后我们无法显示任何内容一样。它应该进入 laravel 错误屏幕或自动将您送回登录。

我所有的控制器都有 $this->middleware('auth');,它应该会自动将您重新发送回登录屏幕。

您可以使用路由组轻松地通过路由 class 中的 auth 中间件路由所有流量:

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/

经过大量测试,我发现唯一的解决方案是在所有 'secure' 页面的响应中强制使用 no-store header,这样浏览器就不会缓存它。在慢速网络上,这可能会给页面加载增加一个小的延迟。它只影响返回的响应,页面加载的资产的 none 受到影响。它们仍然可以被缓存。

使用 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;
    }

}

将此中间件添加到 routeMiddleware 部分的 \App\Http\Kernel.php

        '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');
    });

});

现在,查看受保护的页面后,退出并返回,之前的页面不会显示。

如果您只是想阻止使用后退按钮,而不关心用户是否可以按住后退按钮并转到前面的页面,则以下内容会禁用后退按钮。

(当然你可以同时使用禁用缓存和禁用后退按钮)

创建一个新的 'Logged out' 视图

这是可选的,但意味着您可以添加 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'));
    }