【问题标题】:Laravel logout, hittin gthe back button send s me back into the app, how do I prevent thisLaravel注销,点击后退按钮让我回到应用程序,我该如何防止这种情况
【发布时间】:2020-05-11 04:48:43
【问题描述】:

目前我使用默认的 laravel 登录/身份验证控制器、路由、视图并且没有自定义逻辑。我们正在构建一个应用程序,如果您注销并单击返回按钮,则在任何情况下都无法“被带回应用程序,即使您没有会话。”

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

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

【问题讨论】:

  • 您需要阻止浏览器缓存(对于需要保密的页面)和/或删除历史记录。清除历史记录只能通过 javascript 完成,因此意味着在注销确认页面中发送一些代码
  • @Snapey 您能否通过示例解决方案给出正确答案,以便 A 将其标记为已接受,B 明白您在说什么?这听起来像是正确的例子。
  • 经过一些实验,可以将用户重定向到“已注销”页面,并在此页面上将历史记录中的最后一项替换为同一页面。似乎无法删除历史记录中较早的条目,因此虽然用户无法按返回,但他们可以按住返回按钮并选择之前的任何页面。
  • @Snapey 我们的大多数客户都不太懂技术,无法按住后退按钮选择页面

标签: laravel laravel-authorization


【解决方案1】:

经过大量测试,我发现唯一的解决方案是在所有“安全”页面的响应中强制使用 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.phprouteMiddleware 部分

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

});

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

【讨论】:

  • 目前的 macOS Safari 上存在这个解决方案的问题。如果您关闭选项卡然后恢复(CMD+Z“撤消关闭选项卡”),尽管用户已登录,但仍会显示登录表单。这是因为 Safari 在恢复选项卡时不会发送任何 cookie,因此 Laravel 认为没有活动会话。
【解决方案2】:

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

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

创建一个新的“注销”视图

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

【讨论】:

  • 在 Safari 上,我可以长按 History-Back-Button,然后访问我访问过的不同视图。尽管我已注销,但我仍然可以重新访问页面。
【解决方案3】:

您可以使用路由组通过路由类中的身份验证中间件轻松路由所有流量:

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/

【讨论】:

  • 为什么没有 $this->middleware('auth') 在所有控制器中自动执行此操作?
  • 两种方式都很好并且结果相同,但在请求生命周期中发生验证时存在差异。在加载控制器之前(在路由中),同时加载控制器(在构造函数中)。如果用户尝试访问路由,两者都将重定向到登录
  • 不幸的是,浏览器并没有阻止浏览器仅显示其缓存中的内容,而没有引用服务器。
  • 我认为这篇文章会有所帮助twitteinfo.com/…
猜你喜欢
  • 2018-07-04
  • 2023-02-21
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 2012-05-17
  • 2015-03-12
  • 1970-01-01
  • 2023-02-08
相关资源
最近更新 更多