在日志部分,我希望当用户登录时记录我已完成此操作,当他注销时,我希望记录我已完成此操作,如下所示。
但是当用户没有点击退出时(例如,会话时间结束或者他关闭浏览器并退出帐户),我希望日志记录用户的会话如何结束?他自己走了吗?它的会话是否结束并被系统踢出?
我的 Laravel 是 9.52
事件服务提供商:
public function boot()
{
Event::listen(\Illuminate\Auth\Events\Logout::class, function ($event) {
// \Log::info("User logout: {$event->user->name}");
if(Auth::check())
{
Activity::create([
'log_name' => 'route',
'description' => 'Logout',
'causer_id' => Auth::id(),
]);
}
});
创建一个新的中间件用于会话活动跟踪: 创建一个新的中间件类,该类将负责跟踪用户会话活动并处理会话超时。
在app/Http/Middleware目录下创建一个名为TrackSessionActivity.php的文件
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class TrackSessionActivity
{
public function handle($request, Closure $next)
{
if (!Session::has('last_activity')) {
Session::put('last_activity', now());
} else {
$lastActivity = Session::get('last_activity');
$idleTime = now()->diffInMinutes($lastActivity);
if ($idleTime >= config('session.timeout')) {
// Log session expiry or user's inactivity
\Log::info("User session expired or inactive: " . (Auth::user() ? Auth::user()->name : 'Guest'));
}
}
// Update last activity timestamp
Session::put('last_activity', now());
return $next($request);
}
}
更新内核以应用中间件: 打开 app/Http/Kernel.php 并将 'track.session.activity' 添加到 Web 中间件组:
protected $middlewareGroups = [
'web' => [
// ... other middleware entries
\App\Http\Middleware\TrackSessionActivity::class,
],
];
在app/Listeners目录中创建一个名为LoginListener.php的文件
<?php
namespace App\Listeners;
use Illuminate\Auth\Events\Login;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;
class LoginListener
{
public function handle(Login $event)
{
Log::info("User login: {$event->user->name}");
}
}
打开 app/Providers/EventServiceProvider.php 并将 LoginListener 添加到 $listen 数组中:
protected $listen = [
Login::class => [
\App\Listeners\LoginListener::class,
],
];
在同一个 EventServiceProvider 中,添加现有的 Logout 事件侦听器代码:
protected $listen = [
Login::class => [
\App\Listeners\LoginListener::class,
],
\Illuminate\Auth\Events\Logout::class => [
function ($event) {
if (Auth::check()) {
\Log::info("User logout: " . Auth::user()->name);
}
},
],
];
在 config/session.php 配置文件中,您可以定义会话超时时间:
'timeout' => env('SESSION_TIMEOUT', 30), // minutes