【问题标题】:Laravel Authentication on Backpaging through HistoryLaravel 身份验证通过历史记录
【发布时间】:2016-08-24 20:20:41
【问题描述】:

我有一个中间件组定义为:

Route::group(['middleware' => 'auth'], function () {
    Route::get('home', 'Home@Redirect');
    Route::get('create','Create@Redirect');
    Route::get('settings', 'Settings@Redirect');
);

当有人注销时,我将他们重定向到登录页面,然后调用 Auth::Logout() 工作正常,因为他们无法再浏览该站点。

问题是,当您退格浏览器历史记录时,可以向后浏览该站点,但如果他们单击链接尝试浏览该站点,则会被踢出。

一个例子是,我在主页上,然后我退出。我单击退格键并返回主页。然后,我尝试单击主页上的一个链接,该链接要求我进行身份验证,但我被踢出...但我不应该能够返回到我的历史记录以返回主页。

如果不清楚,我可以进一步详细说明或证明更多代码。我在 Laravel 5.0

【问题讨论】:

  • 您可以通过设置缓存控制标头来解决此问题,通常来自某些中间件,您可以调用:$response->headers->set('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate', true);

标签: php laravel authentication middleware browser-history


【解决方案1】:

在大多数情况下(如果不是全部),按下后退按钮不会触发新请求,因此实现“锁定”的唯一方法是在客户端通过 Javascript(或其风格)。

您可能正在使用刀片和主布局,因此只需包含一些 Javascript 即可检测整个网站每个页面上的窗口更改。在(重新)进入时,向您的服务器发出 Ajax 调用,该调用根据其登录状态返回 true/false。如果他们没有登录,使用JS重定向到登录页面。

需要注意的一点:任何对 JS 有任何了解的人都可以轻松绕过这个“检查”,但对于大多数访问您网站的用户来说,它可以达到它的目的。幸运的是,这意味着用户将能够看到他们在登录之前看到的页面。此时没有安全隐患。

【讨论】:

  • 谢谢你,这似乎是一个很好的解决方法,现在我会尝试它并让你知道它是否运行良好,但它似乎是一个短期的快速修复,因为它是客户端实现。谢谢 :-)
【解决方案2】:

这不完全是 Laravel 的问题,它只是网络浏览器的行为。

就像您提到的,在注销后单击指向受保护页面的链接会导致访问被拒绝,这意味着 Laravel 中间件可以完美运行。

我相信您可以使用 JavaScript 在客户端控制这种浏览器行为。

或者

您可以更改所有限制区域的标题,通知浏览器不得缓存内容。

或者

您可以将此添加到您不想缓存的所有页面的 HTML 头标记中。

 <meta http-equiv="cache-control" content="private, max-age=0, no-cache"> 

 <meta http-equiv="pragma" content="no-cache">

 <meta http-equiv="expires" content="0">

【讨论】:

  • 这是很好的信息,谢谢。问题是它正在被缓存,你是对的。我已经尝试过元标记,但问题似乎仍然存在。我知道它的缓存的原因是,当我注销然后清除缓存时,我无法返回页面,因为重定向触发。我将不得不解决这个问题,但感谢您为我指出关于缓存视图的正确路径:-)
【解决方案3】:

我遇到了同样的问题。 你必须创建一个中间件来拦截页面调用,清除缓存

$ php artisan make:middleware RevalidateBackHistory

覆盖函数HANDLE

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

我将它添加到数组 $routeMiddleware 中的 kernel.php

'revalidate' => \App\Http\Middleware\RevalidateBackHistory::class,

并将它们分组

Route::group(['middleware' => 'revalidate'], function()
{
    // Routes that you want to revalidate go in here
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 2011-10-27
    • 2016-07-28
    • 2020-09-14
    • 2020-04-17
    • 2020-12-02
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多