php - 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 令牌从不匹配
我发现这是在VerifyCsrfToken
类tokensMatch()
方法中发生的,Laravel 中的代码在这里
$request->input("_token")
正确设置为 HTML 表单中的标记(来自@csrf
刀片模板)$request->session()->token()
完全设置为其他内容,导致tokensMatch()
为假
$request->session()->token()
似乎每次请求都会改变。
原因?登录时会话不会为用户保留
似乎SESSION_DRIVER=database
是造成问题的原因。每个请求都会获得一个新会话,并且表_token
中的所有行都设置为. 似乎存储在数据库中的会话并没有为每个用户保留。sessions
user_id
null
有谁知道如何解决会话以使它们在何时工作SESSION_DRIVER=database
?任何帮助表示赞赏,谢谢!
解决方案
解决方案
- 在
session.php
我将“same_site”设置为“lax”
'same_site' => "lax",
- 在 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,
],
];
推荐阅读
- spring-cloud-stream - RabbitMQ 忽略标头内容类型
- java - JavaFX 不会加载 FXML,找不到资源
- ms-access - 访问报告以省略没有空格的“无数据”字段
- excel - 循环遍历组框中的每个控件
- linux - 在 linux 中对特定字符串使用 grep 命令
- javascript - React & Redux:调度动作不起作用
- python - 列出从 _nth_ 到最后一个元素的切片
- jenkins - 在 Docker contianer 中将 Jenkins 从站连接到主站
- javascript - 在 iframe 的父级中打开一个包含在 iframe 中的 react-vr 应用程序的网站
- r - Facet_wrap:基于 label_value 的条件格式?