Laravel 5.8 在从已清除的会话单击注销后显示“419 页已过期”

2022-08-30 23:56:28

我运行php artisan make:auth命令,我将逐步解释我之后做了什么来理解场景,

  • 登录到新会话(example.com/home)
  • 打开一个新选项卡并粘贴url,即 example.com/home。
  • 现在,2个选项卡以相同的会话打开。
  • 我从其中一个选项卡中单击注销,它工作正常
  • 然后,当我尝试从其他选项卡注销时,它给我一个错误,说“419页面已过期”,即使在重新加载后,它也无处可去。

问题是,可能会出现这些情况,我不想看到此错误消息,只需在单击注销后注销,即使会话已过期。

注意:此问题不是因为没有添加@csrf


答案 1

好吧,这是一个明显的消息,你可以尝试为该页面制作更好的布局,但仍然很好显示它,以便用户知道发生了什么。如果您想以不同的方式处理它,可以尝试重定向到登录页面。

因此,在渲染方法中的文件中,添加以下内容:app\Exceptions\Handler.php

if ($exception instanceof \Illuminate\Session\TokenMismatchException) {
    return redirect()->route('login');
}

答案 2

这个问题的解决方案相对简单,并且需要对VerifyCsrfToken中间件进行少量添加;

use Closure;


    public function handle($request, Closure $next)
    {
        if(!Auth::check() && $request->route()->named('logout')) {
        
            $this->except[] = route('logout');
            
        }
        
        return parent::handle($request, $next);
    }

通常,此文件仅包含一个$except路由数组,应从 csrf 中忽略这些路由。

在此代码中,我们重写 handle 方法并执行两次检查。

  • 用户是来宾(即,不使用经过身份验证的会话),并且,
  • 是路由注销路由

如果两者都为真,则我们将“logout”添加到 except 数组中。然后,我们将控制权传递给核心 VerifyCsrfMiddleware,该软件识别阵列中是否存在注销路由,并绕过检查。表单数据已正确发布,并且我们使用注销响应进行重定向。

用户看不到任何错误页面。

通过以这种方式进行检查,我们确保真正的注销请求仍然受到CSRF令牌的保护。


推荐