One possible solution is to keep track of the number of active sessions for each user in the database. Whenever a user logs in, you can increment the session count and check if it exceeds the maximum allowed number of sessions. If it does, you can log out the oldest session and decrement the session count.
Here's an example implementation:
- Add a
session_countcolumn to theuserstable:
Schema::table('users', function (Blueprint $table) {
$table->integer('session_count')->default(0);
});
- In the
LoginController, increment the session count and check if it exceeds the maximum allowed number of sessions:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
if ($user->session_count >= 5) {
// Log out the oldest session
Auth::logoutOtherDevices($request->password);
// Decrement the session count
$user->session_count--;
$user->save();
}
// Increment the session count
$user->session_count++;
$user->save();
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'email' => 'The provided credentials do not match our records.',
]);
}
}
- In the
LogoutController, decrement the session count:
use Illuminate\Support\Facades\Auth;
class LogoutController extends Controller
{
public function logout(Request $request)
{
$user = Auth::user();
// Decrement the session count
$user->session_count--;
$user->save();
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
}