You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10 Fortify登出时无法获取用户信息的问题求助

Laravel 10 Fortify 登出时获取用户信息的解决方案

问题根源

Fortify 的默认登出流程是先执行会话销毁动作,再返回响应,所以当你在自定义 LogoutResponse 的 toResponse 方法中调用 $request->user() 时,用户已经被登出,自然无法获取到用户信息。而你尝试使用 AuthenticatedSessionController 未生效,是因为 Fortify 默认注册了自己的登出路由,若未禁用该路由,Fortify 的路由会优先匹配,不会进入你的自定义控制器方法。

可行解决方案

方案一:监听 Logout 事件

Laravel 会在用户登出前触发 Illuminate\Auth\Events\Logout 事件,该事件携带当前用户实例,可直接获取信息。

  1. 创建事件监听器
php artisan make:listener LogoutUserListener
  1. 注册事件与监听器
    在 app/Providers/EventServiceProvider.php 的 $listen 数组中添加:
protected $listen = [
    \Illuminate\Auth\Events\Logout::class => [
        \App\Listeners\LogoutUserListener::class,
    ],
];
  1. 编写监听器逻辑
    在 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:创建独立的登出动作类

  1. 创建自定义动作类
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();
    }
}
  1. 在 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:45:59