如何获取用户的活跃时间,Laravel

问题描述 投票:0回答:1

在日志部分,我希望当用户登录时记录我已完成此操作,当他注销时,我希望记录我已完成此操作,如下所示。

但是当用户没有点击退出时(例如,会话时间结束或者他关闭浏览器并退出帐户),我希望日志记录用户的会话如何结束?他自己走了吗?它的会话是否结束并被系统踢出?

我的 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(),
 
                ]);
            }
 
        });
laravel security
1个回答
0
投票

创建一个新的中间件用于会话活动跟踪: 创建一个新的中间件类,该类将负责跟踪用户会话活动并处理会话超时。

在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
© www.soinside.com 2019 - 2024. All rights reserved.