Laravel 9 password.confirm中间件失效问题求助
检查会话中的密码确认有效期
Laravel的password.confirm中间件默认会记录用户最近一次确认密码的时间(存储在session的password_confirmed_at键中),默认有效期为1小时。如果请求发起时该时间仍在有效期内,中间件会直接放行。可以通过清除浏览器缓存/会话,或等待1小时后重新测试,确认是否触发密码确认流程。确认中间件配置正确性
确保在app/Http/Kernel.php的$routeMiddleware中正确注册官方提供的中间件:protected $routeMiddleware = [ // ... 其他中间项 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, ];若你自定义了同名中间件,可能逻辑不符合预期,需替换为官方自带的
RequirePassword类。确认请求处于web会话环境
password.confirm中间件依赖Laravel的Session功能,需确保目标路由处于web中间件组内(默认routes/web.php中的路由已包含该组)。如果是routes/api.php中的API路由,由于默认无Session支持,中间件无法正常工作,需手动为API路由添加Session中间件(不推荐,API场景通常采用Token认证)。验证请求类型与中间件逻辑匹配
当访问需要密码确认的POST路由时,若用户未在有效期内确认过密码,中间件会自动重定向到密码确认页面(GET请求password/confirm)。用户在该页面提交密码验证通过后,才会被重定向回原POST路由并执行控制器逻辑。若你通过Postman等工具直接发起POST请求,需先确保会话中已完成密码确认,或先发起GET请求到password/confirm页面、提交密码后再发起目标POST请求。
内容的提问来源于stack exchange,提问作者Md. Shamvil Hossain

