implement browse session system

This commit is contained in:
Nima8FT 2025-04-23 15:04:58 +03:30
parent 6e8f115396
commit a42b9967d9
11 changed files with 350 additions and 2 deletions

View File

@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Models\DeviceSession;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class BrowseSessionController extends Controller
{
public function browseSession()
{
$user = Auth::user();
$device_sessions = DeviceSession::where("user_id", $user->id)->get();
return view("auth.browse-session", compact(['device_sessions','user']));
}
}

View File

@ -2,7 +2,9 @@
namespace App\Http\Controllers\Auth;
use Jenssegers\Agent\Agent;
use Illuminate\Http\Request;
use App\Models\DeviceSession;
use App\Http\Requests\LoginRequest;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
@ -29,6 +31,19 @@ class LoginController extends Controller
$request->session()->regenerate();
//browse session
$agent = new Agent();
$user = Auth::user();
DeviceSession::create([
'user_id' => $user->id,
'session_id' => session()->getId(),
'browser' => $agent->browser(),
'os' => $agent->platform(),
'device' => $agent->device(),
'is_mobile' => $agent->isMobile()
]);
return redirect()->route('dashboard')->with("success", "login successfully");
} catch (\Exception $e) {
return redirect()

View File

@ -3,9 +3,11 @@
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Models\DeviceSession;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class LogoutController extends Controller
{
@ -21,6 +23,8 @@ class LogoutController extends Controller
'verify2fa' => 0,
]);
DeviceSession::where('session_id', session()->getId())->delete();
Auth::logout();
$request->session()->invalidate();
@ -36,8 +40,26 @@ class LogoutController extends Controller
$request->session()->invalidate();
$request->session()->regenerateToken();
DeviceSession::where('user_id', $this->user->id)->delete();
$this->user->delete();
return redirect()->route('login')->with('success', 'Your account has been deleted successfully.');
}
public function logoutOtherDevice(Request $request)
{
$currentSessionId = Session::getId();
DB::table('sessions')
->where('user_id', $this->user->id)
->where('id', '!=', $currentSessionId)
->delete();
DeviceSession::where('user_id', $this->user->id)
->where('session_id', '!=', $currentSessionId)
->delete();
return back()->with('success', 'logout other system successfully');
}
}

View File

@ -3,7 +3,9 @@
namespace App\Http\Controllers\Auth;
use App\Models\User;
use Jenssegers\Agent\Agent;
use Illuminate\Http\Request;
use App\Models\DeviceSession;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
@ -27,6 +29,19 @@ class RegisterController extends Controller
Auth::login($user);
//browse session
$agent = new Agent();
$user = Auth::user();
DeviceSession::create([
'user_id' => $user->id,
'session_id' => session()->getId(),
'browser' => $agent->browser(),
'os' => $agent->platform(),
'device' => $agent->device(),
'is_mobile' => $agent->isMobile()
]);
return redirect()->route('dashboard')->with('success', 'register successfully');
} catch (\Exception $e) {
return redirect()

View File

@ -0,0 +1,12 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class DeviceSession extends Model
{
protected $table = "device_sessions";
protected $fillable = ['user_id', 'session_id', 'browser', 'os', 'device', 'is_mobile'];
}

View File

@ -11,6 +11,7 @@
"require": {
"php": "^8.2",
"bacon/bacon-qr-code": "^3.0",
"jenssegers/agent": "^2.6",
"laravel/framework": "^12.0",
"laravel/socialite": "^5.20",
"laravel/tinker": "^2.10.1",

View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "7ec9c18ae33503f4d06a9ce3cef2e3cf",
"content-hash": "697d12ed7febd693f209d0ab08d7631b",
"packages": [
{
"name": "bacon/bacon-qr-code",
@ -1354,6 +1354,141 @@
],
"time": "2025-02-03T10:55:03+00:00"
},
{
"name": "jaybizzle/crawler-detect",
"version": "v1.3.4",
"source": {
"type": "git",
"url": "https://github.com/JayBizzle/Crawler-Detect.git",
"reference": "d3b7ff28994e1b0de764ab7412fa269a79634ff3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/d3b7ff28994e1b0de764ab7412fa269a79634ff3",
"reference": "d3b7ff28994e1b0de764ab7412fa269a79634ff3",
"shasum": ""
},
"require": {
"php": ">=7.1.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4"
},
"type": "library",
"autoload": {
"psr-4": {
"Jaybizzle\\CrawlerDetect\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Beech",
"email": "m@rkbee.ch",
"role": "Developer"
}
],
"description": "CrawlerDetect is a PHP class for detecting bots/crawlers/spiders via the user agent",
"homepage": "https://github.com/JayBizzle/Crawler-Detect/",
"keywords": [
"crawler",
"crawler detect",
"crawler detector",
"crawlerdetect",
"php crawler detect"
],
"support": {
"issues": "https://github.com/JayBizzle/Crawler-Detect/issues",
"source": "https://github.com/JayBizzle/Crawler-Detect/tree/v1.3.4"
},
"time": "2025-03-05T23:12:10+00:00"
},
{
"name": "jenssegers/agent",
"version": "v2.6.4",
"source": {
"type": "git",
"url": "https://github.com/jenssegers/agent.git",
"reference": "daa11c43729510b3700bc34d414664966b03bffe"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jenssegers/agent/zipball/daa11c43729510b3700bc34d414664966b03bffe",
"reference": "daa11c43729510b3700bc34d414664966b03bffe",
"shasum": ""
},
"require": {
"jaybizzle/crawler-detect": "^1.2",
"mobiledetect/mobiledetectlib": "^2.7.6",
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5.0|^6.0|^7.0"
},
"suggest": {
"illuminate/support": "Required for laravel service providers"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Agent": "Jenssegers\\Agent\\Facades\\Agent"
},
"providers": [
"Jenssegers\\Agent\\AgentServiceProvider"
]
},
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"Jenssegers\\Agent\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jens Segers",
"homepage": "https://jenssegers.com"
}
],
"description": "Desktop/mobile user agent parser with support for Laravel, based on Mobiledetect",
"homepage": "https://github.com/jenssegers/agent",
"keywords": [
"Agent",
"browser",
"desktop",
"laravel",
"mobile",
"platform",
"user agent",
"useragent"
],
"support": {
"issues": "https://github.com/jenssegers/agent/issues",
"source": "https://github.com/jenssegers/agent/tree/v2.6.4"
},
"funding": [
{
"url": "https://github.com/jenssegers",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/jenssegers/agent",
"type": "tidelift"
}
],
"time": "2020-06-13T08:05:20+00:00"
},
{
"name": "laravel/framework",
"version": "v12.10.0",
@ -2590,6 +2725,68 @@
},
"time": "2025-04-03T12:16:11+00:00"
},
{
"name": "mobiledetect/mobiledetectlib",
"version": "2.8.45",
"source": {
"type": "git",
"url": "https://github.com/serbanghita/Mobile-Detect.git",
"reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/96aaebcf4f50d3d2692ab81d2c5132e425bca266",
"reference": "96aaebcf4f50d3d2692ab81d2c5132e425bca266",
"shasum": ""
},
"require": {
"php": ">=5.0.0"
},
"require-dev": {
"phpunit/phpunit": "~4.8.36"
},
"type": "library",
"autoload": {
"psr-0": {
"Detection": "namespaced/"
},
"classmap": [
"Mobile_Detect.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Serban Ghita",
"email": "serbanghita@gmail.com",
"homepage": "http://mobiledetect.net",
"role": "Developer"
}
],
"description": "Mobile_Detect is a lightweight PHP class for detecting mobile devices. It uses the User-Agent string combined with specific HTTP headers to detect the mobile environment.",
"homepage": "https://github.com/serbanghita/Mobile-Detect",
"keywords": [
"detect mobile devices",
"mobile",
"mobile detect",
"mobile detector",
"php mobile detect"
],
"support": {
"issues": "https://github.com/serbanghita/Mobile-Detect/issues",
"source": "https://github.com/serbanghita/Mobile-Detect/tree/2.8.45"
},
"funding": [
{
"url": "https://github.com/serbanghita",
"type": "github"
}
],
"time": "2023-11-07T21:57:25+00:00"
},
{
"name": "monolog/monolog",
"version": "3.9.0",

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('device_sessions', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->string('session_id')->nullable()->unique();
$table->string('browser')->nullable();
$table->string('os')->nullable();
$table->string('device')->nullable();
$table->boolean('is_mobile')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('device_sessions');
}
};

View File

@ -0,0 +1,30 @@
@extends('layouts.aside')
@section('main')
<main class="min-h-screen w-full flex items-center justify-center bg-[#0d1b2a] overflow-auto py-5">
<div class="bg-[#1b263b] p-8 rounded-xl shadow-2xl max-w-[800px] w-full transition-all duration-300">
<h1 class="text-3xl font-semibold text-center text-[#e0e1dd] mb-10">Browse Session</h1>
@foreach($device_sessions as $session)
<div class="bg-[#0d1b2a] text-[#e0e1dd] p-4 my-2 rounded-xl shadow">
🖥️ {{ $session->browser }} - {{ $session->os }}
<br>
🕐 {{ $session->created_at->diffForHumans() }}
</div>
@endforeach
<form action="{{route('logout.other.device')}}" method="POST" class="mt-8 text-center">
@csrf
<button type="submit"
class="bg-red-600 cursor-pointer hover:bg-red-700 text-white font-semibold px-6 py-2 rounded-lg shadow-md transition duration-300 ease-in-out">
Logout Other Devices
</button>
</form>
</div>
</main>
@endsection

View File

@ -19,7 +19,7 @@
class="block px-4 py-2 rounded-lg hover:bg-[#415a77] transition">
🔐 Change Password
</a>
<a href="#" class="block px-4 py-2 rounded-lg hover:bg-[#415a77] transition">
<a href="{{route('browse.session')}}" class="block px-4 py-2 rounded-lg hover:bg-[#415a77] transition">
🖥️ Browse Session
</a>
</nav>

View File

@ -1,5 +1,6 @@
<?php
use App\Http\Controllers\Auth\BrowseSessionController;
use App\Http\Controllers\Auth\SocialLoginController;
use Illuminate\Support\Facades\Route;
use Laravel\Socialite\Facades\Socialite;
@ -27,6 +28,7 @@ Route::group(['middleware' => 'auth'], function () {
Route::post('logout', action: [LogoutController::class, 'logout'])->name('logout');
Route::post('delete-account', action: [LogoutController::class, 'deleteAccount'])->name('delete.account');
Route::post('logout-other-device', [LogoutController::class, 'logoutOtherDevice'])->name('logout.other.device');
//verify mail
Route::post('email/verification-notification', [MailController::class, 'notification'])->name('verification.send');
@ -46,6 +48,9 @@ Route::group(['middleware' => 'auth'], function () {
//change password in profile
Route::get('change-password', [PasswordController::class, 'changePasswordPage'])->name('change.password.show');
Route::post('change-password', [PasswordController::class, 'changePassword'])->name('change.password');
//browse session
Route::get('browse-session', [BrowseSessionController::class, 'browseSession'])->name('browse.session');
});