在 Laravel 5 中注销后阻止浏览器的后退按钮登录

2022-08-30 14:58:42

我是Laravel 5的新手,并试图制作一个简单的身份验证页面。我的问题是,我可以在单击注销链接后正确注销,但是如果我单击浏览器的后退按钮,仍然能够看到页面的内容,这些内容实际上不应该在我的身份验证中间件过程中看到。我读到我可以通过禁用缓存来防止这种情况,但不要认为这是最好的方法,所以我如何以更好的方式做到这一点?简单地说,我的注销路由是

Route::get('logout', array('uses' => 'LoginController@logout'));

注销功能为:

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

答案 1

使用工匠创建中间件:

php artisan make:middleware RevalidateBackHistory

在RevaliddateBackHistory中间件中,我们将标头设置为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');
    }
}

在内核中更新应用程序的路由中间件.php:

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

仅此而已!因此,基本上您只需要为需要用户身份验证的路由调用重新验证中间件。


答案 2

当用户单击后退按钮时,他们实际上并未登录,它只是浏览器呈现从以前的页面视图中缓存的内容。用户将无法导航或与需要他们登录的任何内容进行交互,因为对于服务器上的应用程序,他们未经过身份验证。

当用户单击后退按钮时,您无法控制它,因为它不会向服务器发出请求

使用后退按钮,他们能够查看的唯一内容是他们在登录时已经访问过的内容。如果他们尝试访问任何新内容,他们将向您的应用程序发出新请求,您的中间件将触发并将其重定向到登录页面。

我想如果你真的想停止这种行为,你可以使用一些JavaScript等来发送ajax请求并检查用户是否以这种方式登录,但从安全角度来看,这是非常无用的。


推荐