Laravel 10 Fortify登出时无法获取用户信息的问题求助
Laravel 10 Fortify 登出时获取用户信息的解决方案
问题根源
Fortify 的默认登出流程是先执行会话销毁动作,再返回响应,所以当你在自定义 LogoutResponse 的 toResponse 方法中调用 $request->user() 时,用户已经被登出,自然无法获取到用户信息。而你尝试使用 AuthenticatedSessionController 未生效,是因为 Fortify 默认注册了自己的登出路由,若未禁用该路由,Fortify 的路由会优先匹配,不会进入你的自定义控制器方法。
可行解决方案
方案一:监听 Logout 事件
Laravel 会在用户登出前触发 Illuminate\Auth\Events\Logout 事件,该事件携带当前用户实例,可直接获取信息。
- 创建事件监听器
php artisan make:listener LogoutUserListener
- 注册事件与监听器
在app/Providers/EventServiceProvider.php的$listen数组中添加:
protected $listen = [ \Illuminate\Auth\Events\Logout::class => [ \App\Listeners\LogoutUserListener::class, ], ];
- 编写监听器逻辑
在app/Listeners/LogoutUserListener.php的handle方法中处理用户信息:
public function handle(\Illuminate\Auth\Events\Logout $event) { $user = $event->user; // 这里可对用户信息进行操作,比如记录登出日志、更新状态等 }
方案二:自定义 Fortify 登出动作
直接替换 Fortify 默认的登出动作,在销毁会话前先获取并处理用户信息。
方式1:直接在 FortifyServiceProvider 中定义
在 FortifyServiceProvider 的 boot 方法中添加:
use Laravel\Fortify\Fortify; public function boot() { // 其他 Fortify 配置... Fortify::logoutUsing(function ($request) { // 登出前获取用户信息 $user = $request->user(); // 执行自定义逻辑,比如记录操作 // $user->update(['last_logout_at' => now()]); // 执行默认登出流程 auth()->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); // 返回自定义登出响应 return app(\Laravel\Fortify\Contracts\LogoutResponse::class)->toResponse($request); }); }
方式2:创建独立的登出动作类
- 创建自定义动作类
namespace App\Actions\Fortify; use Laravel\Fortify\Contracts\Logout as LogoutContract; class CustomLogout implements LogoutContract { public function handle($request) { $user = $request->user(); // 处理用户信息 // 执行默认登出逻辑 auth()->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); } }
- 在
FortifyServiceProvider中绑定
use Laravel\Fortify\Contracts\Logout as LogoutContract; use App\Actions\Fortify\CustomLogout; public function register() { $this->app->singleton(LogoutContract::class, CustomLogout::class); }
内容的提问来源于stack exchange,提问作者Rémi Tardif
相关产品推荐
相关产品推荐

