Mengelola sesi pengguna sangat penting dalam mengamankan aplikasi dan memastikan pengalaman pengguna yang mulus. Laravel menyediakan mekanisme bawaan untuk menangani sesi pengguna. Di sini kita akan mengatur dan mengelola sesi pengguna menggunakan autentikasi dasar yang telah kita buat sebelumnya.

1. Konfigurasi Session

Laravel secara default menggunakan file untuk menyimpan sesi, tetapi kamu dapat mengonfigurasi penyimpanan sesi menggunakan database, Redis, atau lainnya. Untuk mengonfigurasi sesi, edit file `config/session.php`.

Pastikan driver sesi sudah diatur ke file:

'driver' => env('SESSION_DRIVER', 'file'),

2. Menggunakan Middleware untuk Melindungi Route

Untuk memastikan hanya pengguna yang diautentikasi yang dapat mengakses route tertentu, gunakan middleware auth.

Contoh melindungi route:


Route::group(['middleware' => 'auth'], function () {
	Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
});

3. Menggunakan Middleware untuk Peran Spesifik

Jika kamu ingin melindungi route berdasarkan peran, gunakan middleware role yang disediakan oleh Spatie Laravel Permission.

Contoh melindungi route dengan peran admin:


Route::group(['middleware' => ['role:admin']], function () {
	Route::get('/admin', [AdminController::class, 'index'])->name('admin.index');
});

4. Mengelola Sesi Pengguna

kamu bisa menyimpan data ke dalam sesi menggunakan facade Session.

Contoh menyimpan data:


use Illuminate\Support\Facades\Session;
Session::put('key', 'value');

Untuk mengambil data dari sesi:


$value = Session::get('key');

Untuk menghapus data dari sesi:


Session::forget('key');

Flash Data

Data flash hanya tersedia pada request berikutnya. Cocok digunakan untuk pesan kesuksesan atau error. Menyimpan flash data:


Session::flash('status', 'Task was successful!');

Mengambil flash data di view:


@if (Session::has('status'))
	<div class="alert alert-success">
		{{ Session::get('status') }}
	</div>
@endif

5. Menambahkan Middleware untuk Timeout Sesi

Untuk menambahkan fitur timeout sesi pengguna, buat middleware baru yang memeriksa aktivitas pengguna.

Buat middleware:
php artisan make:middleware SessionTimeout

Edit middleware yang baru dibuat di app/Http/Middleware/SessionTimeout.php:


namespace App\Http\Middleware;

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

class SessionTimeout
{
	protected $timeout = 1200; // Timeout in seconds (20 minutes)

	public function handle($request, Closure $next)
	{
		if (!session('lastActivityTime')) {
			session(['lastActivityTime' => now()]);
		} elseif (now()->diffInSeconds(session('lastActivityTime')) > $this->timeout) {
			Auth::logout();
			Session::flush();
			return redirect('/login')->with('message', 'You have been logged out due to inactivity.');
		}

		session(['lastActivityTime' => now()]);

		return $next($request);
	}
}

Tambahkan middleware ke app/Http/Kernel.php:


protected $middlewareGroups = [
	'web' => [
		// ...
		\App\Http\Middleware\SessionTimeout::class,
	],
];

6. Logout Pengguna

Laravel sudah memiliki route dan controller untuk logout yang dihasilkan oleh Laravel UI. Pastikan route logout ada di routes/web.php:

Route::post('/logout', [LoginController::class, 'logout'])->name('logout');

Link untuk logout di view:


<form action="{{ route('logout') }}" method="POST">
	@csrf
	<button type="submit">Logout</button>
</form>

7. Mengelola Login Attempts dan Lockout

Laravel memiliki fitur bawaan untuk membatasi jumlah percobaan login yang gagal dan mengunci pengguna sementara setelah sejumlah percobaan yang gagal.

Edit file app/Http/Controllers/Auth/LoginController.php:


protected $maxAttempts = 5; // Maximum number of attempts to allow
protected $decayMinutes = 1; // Number of minutes to lock the login

Kesimpulan

Dengan mengikuti langkah-langkah di atas, kamu telah mengelola sesi pengguna dalam aplikasi Laravel kamu. kamu telah mengkonfigurasi penyimpanan sesi, melindungi route dengan middleware, menyimpan dan mengambil data dari sesi, serta menambahkan fitur timeout sesi pengguna.