首页 > 解决方案 > SESSION_DRIVER=database 时 Laravel 表单响应 HTTP 419

问题描述

我的登录表单使用时运行良好,SESSION_DRIVER=file但是当更改为SESSION_DRIVER=database并尝试使用刀片表单登录时,我总是收到 HTTP 419。

登录表单确实包含 @csrf 令牌

  <form method="POST" action="{{ route('admin-login') }}">
          @csrf 
            <div class="form-group row">
....

每当我提交登录表单时,我都会收到此回复

419 Page Expired

失败原因:会话 CSRF 令牌从不匹配

我发现这是在VerifyCsrfTokentokensMatch()方法中发生的,Laravel 中的代码在这里

$request->session()->token()似乎每次请求都会改变。

原因?登录时会话不会为用户保留

似乎SESSION_DRIVER=database是造成问题的原因。每个请求都会获得一个新会话,并且表_token 中的所有行都设置为. 似乎存储在数据库中的会话并没有为每个用户保留。sessionsuser_idnull

有谁知道如何解决会话以使它们在何时工作SESSION_DRIVER=database?任何帮助表示赞赏,谢谢!

标签: phplaravellaravel-8

解决方案


解决方案

  1. session.php我将“same_site”设置为“lax”
    'same_site' => "lax",
  1. 在 Kernel.php 中,StartSession中间件包含在“web”$middleware$middlewareGroups“web”中。这导致它运行StartSession两次,并为每个请求用一个新会话覆盖现有会话。删除“web”中的重复项$middlewareGroups修复了它。
  protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Fruitcake\Cors\HandleCors::class,
    ];

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
         ------> these two below were the issue. removing them fixed it <------
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        ],
    ];

推荐阅读