Tutorial Laravel: Membuat Sistem Pengaduan Masyarakat (Tahap 4: Authentication & Multi-Role Middleware)

Setelah data akun siap di database, langkah selanjutnya adalah membangun Sistem Otentikasi (Login & Logout) serta Middleware Multi-Role untuk mengamankan dan memisahkan hak akses antara Admin dan Masyarakat.
📋 Ringkasan Tahap 4
- Tujuan: Membuat Controller autentikasi, Middleware pembatas akses, tampilan form login, dan pendaftaran Route.
- Fitur Utama: Login multi-role, proteksi halaman dengan Middleware, dan proses Logout yang aman.
- Estimasi Waktu: 5 – 8 Menit.
🛠️ Langkah-Langkah Eksekusi
1. Membuat AuthController
Jalankan perintah Artisan berikut di terminal untuk membuat controller otentikasi:
php artisan make:controller AuthController
Buka file app/Http/Controllers/AuthController.php dan isi kodenya seperti berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
// Menampilkan halaman form login
public function showLoginForm()
{
return view('auth.login');
}
// Memproses data login pengguna
public function login(Request $request)
{
$credentials = $request->validate([
'email' => 'required|email',
'password' => 'required',
]);
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
// Pengalihan halaman berdasarkan Role
if (Auth::user()->role === 'admin') {
return redirect()->intended('/admin/dashboard');
}
return redirect()->intended('/user/dashboard');
}
return back()->withErrors([
'email' => 'Email atau password yang Anda masukkan salah.',
])->onlyInput('email');
}
// Memproses logout pengguna
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login');
}
}
2. Membuat Middleware Multi-Role (RoleMiddleware)
Middleware ini berfungsi sebagai “satpam” pintu masuk yang akan memeriksa apakah pengguna yang mencoba mengakses suatu halaman memiliki peran (role) yang sesuai.
Jalankan perintah ini di terminal:
php artisan make:middleware RoleMiddleware
Buka file app/Http/Middleware/RoleMiddleware.php dan sesuaikan method handle():
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class RoleMiddleware
{
public function handle(Request $request, Closure $next, string $role): Response
{
// Periksa apakah pengguna sudah login dan memiliki role yang sesuai
if (!Auth::check() || Auth::user()->role !== $role) {
abort(403, 'Anda tidak memiliki hak akses untuk membuka halaman ini.');
}
return $next($request);
}
}
💡 Pendaftaran Middleware:
- Laravel 11: Buka
bootstrap/app.phpdan daftarkan aliasnya di fungsiwithMiddleware:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => \App\Http\Middleware\RoleMiddleware::class,
]);
})
- Laravel 10 / Versi Sebelumnya: Buka
app/Http/Kernel.phplalu tambahkan'role' => \App\Http\Middleware\RoleMiddleware::classdi dalam array$middlewareAliases.
3. Membuat Tampilan Form Login (auth/login.blade.php)
Buat folder baru bernama auth di dalam resources/views/, lalu buat file login.blade.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Login - Sistem Pengaduan Masyarakat</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light d-flex align-items-center vh-100">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4">
<div class="card shadow-sm">
<div class="card-body p-4">
<h4 class="card-title text-center mb-4">Silakan Login</h4>
@if($errors->any())
<div class="alert alert-danger">
{{ $errors->first() }}
</div>
@endif
<form action="{{ route('login') }}" method="POST">
@csrf
<div class="mb-3">
<label class="form-label">Email</label>
<input type="email" name="email" class="form-control" value="{{ old('email') }}" required autofocus>
</div>
<div class="mb-3">
<label class="form-label">Password</label>
<input type="password" name="password" class="form-control" required>
</div>
<button type="submit" class="btn btn-primary w-100">Login</button>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
4. Mengatur Route Aplikasi (routes/web.php)
Buka file routes/web.php dan susun alur route beserta proteksi middleware-nya:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AuthController;
// Direct Halaman Utama ke Login
Route::get('/', function () {
return redirect()->route('login');
});
// Route Guest (Hanya bisa diakses sebelum login)
Route::middleware('guest')->group(function () {
Route::get('/login', [AuthController::class, 'showLoginForm'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
});
// Route Logout (Perlu otentikasi)
Route::post('/logout', [AuthController::class, 'logout'])->name('logout')->middleware('auth');
// Grup Route khusus Admin
Route::middleware(['auth', 'role:admin'])->prefix('admin')->group(function () {
Route::get('/dashboard', function () {
return view('admin.dashboard');
})->name('admin.dashboard');
});
// Grup Route khusus User (Masyarakat)
Route::middleware(['auth', 'role:user'])->prefix('user')->group(function () {
Route::get('/dashboard', function () {
return view('user.dashboard');
})->name('user.dashboard');
});
