Laravel 8 Auth::logoutOtherDevices始终跳转login路由问题
问题根因
触发跨设备登出时首次跳转默认login路由,和你自定义的Authenticate中间件配置无关,核心原因是:
Auth::logoutOtherDevices的跨设备会话校验逻辑由AuthenticateSession中间件执行,这个中间件自带独立的未认证跳转逻辑,执行优先级早于你自定义的Authenticate中间件- 跨设备登出触发时,其他设备的请求进入后,
AuthenticateSession中间件会校验会话内存储的用户密码哈希,发现和当前数据库值不匹配时,会直接抛出认证异常,默认硬编码跳转至login路由,完全不会调用你在Authenticate中间件里编写的redirectTo方法 - 你在
Authenticate中间件中添加的dd()调试代码首次不触发,就是因为请求还没走到Authenticate中间件就已经被拦截跳转;等你手动刷新页面时,旧会话已经被完全清理,请求才会进入Authenticate中间件,触发你配置的auth.show路由跳转逻辑。
修复方案
只需要重写AuthenticateSession中间件的跳转规则即可,操作步骤如下:
- 第一步:新建自定义的
AuthenticateSession中间件,继承框架自带的核心类,重写跳转方法:
namespace App\Http\Middleware; use Illuminate\Session\Middleware\AuthenticateSession as BaseAuthenticateSession; class AuthenticateSession extends BaseAuthenticateSession { /** * 未通过会话校验时的跳转路径 * * @param \Illuminate\Http\Request $request * @return string|null */ protected function redirectTo($request) { if (! $request->expectsJson()) { return route('auth.show'); } } }
- 第二步:打开
app/Http/Kernel.php文件,在web中间件组的配置中,将框架自带的AuthenticateSession中间件替换为你刚才编写的自定义版本:
protected $middlewareGroups = [ 'web' => [ // 保留其他原有中间件配置 \App\Http\Middleware\Authenticate::class, // 注释或删除原有的 \Illuminate\Session\Middleware\AuthenticateSession::class \App\Http\Middleware\AuthenticateSession::class, // 替换为自定义中间件 // 保留其他原有中间件配置 ], ];
修改完成后,跨设备登出触发时会直接跳转至auth.show路由,不会再出现先跳转未定义login路由的问题。
内容的提问来源于stack exchange,提问作者Iqbal Atma
相关产品推荐
相关产品推荐

