关于 CSRF 验证的顺序的疑问
疑问来源于 未登录状态 Ajax 请求出现 “CSRF token mismatch.” 错误! 这个帖子,因为对 Laravel 也不是特别熟悉,所以调查了2个多小时,最后终于调查明白了。
登录系统后,长时间未操作导致 session 过期了,这时候点击链接(除'HEAD', 'GET', 'OPTIONS' 方法外)的时候,你期待是跳转到登录页面?还是抛出 CSRF 异常呢?
我更侧重于跳转到登录页面,这样也更合理。但是默认的 App\Http\Kernel
文件配置会直接提示 CSRF 异常,原因是因为在登录验证过滤器运行前,会优先执行 CSRF 过滤器导致的。
我的解决方案是修改了默认的 $middlewarePriority
数组,修改为:
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Authenticate::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
将 VerifyCsrfToken
验证过滤器放置在 Authenticate
之后,这样就可以解决上述的问题。也准备提交到官方仓库中,大家可以各抒己见,说出自己的想法。
推荐文章: