关于 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 之后,这样就可以解决上述的问题。也准备提交到官方仓库中,大家可以各抒己见,说出自己的想法。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

laravel 8.17.1 , 好似默認中 $middlewareGroups数组並沒有 php \App\Http\Middleware\Authenticate::class
添加進去後,要出現重定向過多

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!