Laravel Fortify 如何记录登录、密码验证失败及登出认证事件?
Laravel Fortify 记录认证事件实现方案
Fortify本身内置了认证相关的事件,不需要修改配置文件,通过事件监听就能实现日志记录,具体步骤如下:
1. 确认Fortify的内置事件
Fortify已经定义了你需要的三个核心事件:
- 登录成功:
Laravel\Fortify\Events\Login - 密码验证失败:
Laravel\Fortify\Events\FailedPasswordValidation - 登出成功:
Laravel\Fortify\Events\Logout
2. 生成事件监听器
通过Artisan命令快速生成对应事件的监听器:
# 登录事件监听器 php artisan make:listener LogLoginEvent --event=Laravel\\Fortify\\Events\\Login # 密码验证失败事件监听器 php artisan make:listener LogFailedPasswordEvent --event=Laravel\\Fortify\\Events\\FailedPasswordValidation # 登出事件监听器 php artisan make:listener LogLogoutEvent --event=Laravel\\Fortify\\Events\\Logout
3. 编写日志逻辑
打开生成的监听器文件(位于app/Listeners/目录下),在handle方法中添加日志记录代码:
登录成功日志(LogLoginEvent.php)
public function handle(Login $event) { \Illuminate\Support\Facades\Log::info( "用户登录成功", [ 'user_id' => $event->user->id, 'email' => $event->user->email, 'ip' => request()->ip(), 'timestamp' => now()->toDateTimeString() ] ); }
密码验证失败日志(LogFailedPasswordEvent.php)
public function handle(FailedPasswordValidation $event) { \Illuminate\Support\Facades\Log::warning( "密码验证失败", [ 'email' => $event->credentials['email'], 'ip' => request()->ip(), 'timestamp' => now()->toDateTimeString() ] ); }
登出成功日志(LogLogoutEvent.php)
public function handle(Logout $event) { \Illuminate\Support\Facades\Log::info( "用户登出成功", [ 'user_id' => $event->user->id, 'email' => $event->user->email, 'ip' => request()->ip(), 'timestamp' => now()->toDateTimeString() ] ); }
4. 注册监听器
打开app/Providers/EventServiceProvider.php,在$listen数组中添加事件与监听器的映射:
protected $listen = [ // 保留原有事件配置... \Laravel\Fortify\Events\Login::class => [ \App\Listeners\LogLoginEvent::class, ], \Laravel\Fortify\Events\FailedPasswordValidation::class => [ \App\Listeners\LogFailedPasswordEvent::class, ], \Laravel\Fortify\Events\Logout::class => [ \App\Listeners\LogLogoutEvent::class, ], ];
可选:自定义日志渠道
如果想把认证日志单独存储到指定文件,可以在config/logging.php中配置自定义渠道,比如:
'channels' => [ // 其他渠道... 'auth' => [ 'driver' => 'single', 'path' => storage_path('logs/auth.log'), 'level' => 'info', ], ],
然后在监听器中指定渠道:
\Illuminate\Support\Facades\Log::channel('auth')->info(...);
内容的提问来源于stack exchange,提问作者Andreas Christodoulou
相关产品推荐
相关产品推荐

