php Laravel只允许用户从一个设备登录,每个用户只允许一个会话

a9wyjsp7  于 6个月前  发布在  PHP
关注(0)|答案(3)|浏览(121)

我正在开发一个Laravel应用程序,需要实现一个安全功能,允许用户一次只能从一个设备登录。换句话说,我想在我的应用程序中为每个用户强制一个会话。
我知道Laravel提供了内置的会话管理功能,但并不限制用户同时从多个设备登录。为了实现这一要求,我寻求如何实现一个解决方案的指导,以确保用户一次只能有一个活动会话。
以下是我的一些具体问题:
1.如何检测和防止同一用户帐户的多次登录?
1.当用户从新设备登录时,使以前的会话无效的最佳方法是什么?
1.如何处理用户会话变为非活动或过期的情况?
我将非常感谢任何见解或代码示例来帮助我完成这项任务。
这是我目前的登录方式:

public function store(LoginRequest $request)
{
    $request->authenticate();

    // Check if the user already has an active session
    $previousSessionId = Redis::get('ga:user_session_id:' . Auth::id());

    if ($previousSessionId) {
        // Destroy the previous session
        Redis::del('ga:user_session_id:' . Auth::id());

        // Logout the user
        Auth::logout();

        return abort(403); // Return an error response indicating that multiple sessions are not allowed
    }

    $request->session()->regenerate();

    $user = Auth::user();
    $sessionId = uniqid(); // Generate a unique session ID

    // Store the unique session ID in Redis
    Redis::set('ga:user_session_id:' . $user->id, $sessionId);

    if (Auth::user()) {
        if (Auth::user()->hasRole('الوصول الى لوحة التحكم')) {
            return redirect()->route('dashboard');
        } else {
            return redirect()->intended(RouteServiceProvider::HOME);
        }
    }
}

字符串
使用前面的代码,例如,如果我使用设备1登录,它成功登录。如果我在设备1登录时使用设备2登录,它返回403,但当我刷新选项卡时,它也记录了设备2,并且两个设备同时登录。

neskvpey

neskvpey1#

您可以使用Laravel中内置的会话管理功能来强制每个用户使用单个会话。当用户登录时,您可以将其会话ID存储在数据库或缓存中。然后,当同一用户从另一个设备登录时,您可以使其先前的会话无效。

public function store(LoginRequest $request)
{
    $request->authenticate();

    $user = Auth::user();

    // Get the previous session ID from the cache
    $previousSessionId = Redis::get('user_session_id:' . $user->id);

    if ($previousSessionId) {
        // Delete the previous session data
        session()->getHandler()->destroy($previousSessionId);
    }

    // Store the current session ID in the cache
    Redis::set('user_session_id:' . $user->id, session()->getId());

    $request->session()->regenerate();

    if ($user->hasRole('الوصول الى لوحة التحكم')) {
        return redirect()->route('dashboard');
    } else {
        return redirect()->intended(RouteServiceProvider::HOME);
    }
}

字符串

x7yiwoj4

x7yiwoj42#

在这种情况下,您需要向用户模型添加另一个属性:last_sessid
选中此
awnser

0s7z1bwu

0s7z1bwu3#

您可以实现一个中间件,并将其应用于需要保护和强制执行单用户会话的路由。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class SingleSessionMiddleware
{
    public function handle($request, Closure $next)
    {
        $user = Auth::user();

        if ($user && $user->session_token !== session('session_token')) {
            Auth::logout();
            return redirect()->route('login')->with('error', 'You have been logged out from other device.');
        }

        return $next($request);
    }
}

字符串

相关问题