Middleware Bawaan: auth, guest, throttle
Pakai middleware bawaan untuk proteksi route umum.
Konsep: Penjaga di Depan Route
Middleware adalah lapisan yang dilewati request sebelum sampai ke controller. Analogi paling pas: satpam di pintu gedung. Controller tidak perlu tahu siapa yang boleh masuk karena satpam sudah memeriksanya di depan. Laravel menyediakan beberapa satpam bawaan yang menyelesaikan 80% kebutuhan proteksi route tanpa kamu menulis satu class pun.
auth dan guest
// routes/web.php
// hanya untuk user yang sudah login
// tamu otomatis dilempar ke /login
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth');
// hanya untuk tamu (belum login)
// user yang sudah login dilempar ke /home
Route::get('/login', [AuthController::class, 'showLogin'])
->middleware('guest');
Route::post('/login', [AuthController::class, 'login'])
->middleware('guest');Pasangan ini mencegah dua bug UX klasik: tamu mengintip halaman member, dan user yang sudah login nyasar kembali ke halaman login. Perhatikan guest juga dipasang di POST login, supaya user login tidak bisa submit form login dua kali.
verified: Verifikasi Email
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware(['auth', 'verified']);Middleware verified melempar user yang belum verifikasi email ke halaman notice. Urutan penting: auth dulu, baru verified, karena cek verifikasi butuh objek user yang hanya ada setelah auth lewat. Syaratnya model User harus implement MustVerifyEmail:
use Illuminate\Contracts\Auth\MustVerifyEmail;
class User extends Authenticatable implements MustVerifyEmail
{
// ...
}throttle: Batas Kecepatan Request
// routes/api.php
// maksimal 60 request per menit per user/IP
Route::middleware('throttle:60,1')->group(function () {
Route::get('/data', [DataController::class, 'index']);
});
// endpoint sensitif: 5x per menit cegah brute force
Route::post('/login', [AuthController::class, 'login'])
->middleware('throttle:5,1');Formatnya throttle:{maksimal},{menit}. Tanpa throttle, satu script sederhana bisa menghujani endpoint-mu ribuan request per detik: brute force login, scraping massal, atau sekadar bug retry di client yang berubah menjadi DDoS mini. Throttle mengembalikan 429 (Too Many Requests) lengkap dengan header Retry-After supaya client tahu kapan boleh coba lagi.
Untuk aturan lebih ekspresif, definisikan named limiter:
// app/Providers/AppServiceProvider.php
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
public function boot(): void
{
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)->by($request->input('email').'|'.$request->ip());
});
}
// pakai: ->middleware('throttle:login')Kombinasi Berlapis
Middleware dieksekusi berurutan sesuai urutan penulisan, jadi susun dari yang paling umum ke paling spesifik:
Route::middleware(['auth', 'verified', 'throttle:60,1'])->group(function () {
Route::get('/dashboard', ...); // login + email terverifikasi
Route::get('/profil', ...);
});
Route::middleware('guest')->group(function () {
Route::get('/login', ...);
Route::get('/register', ...);
});Jebakan Umum
Pertama, memasang auth tapi lupa mengecualikan route login/register dari group, hasilnya redirect loop: /login butuh auth, auth melempar ke /login, begitu seterusnya. Kedua, memakai middleware auth (session) untuk route API yang dikonsumsi mobile app. API butuh auth:sanctum, bukan auth biasa, karena tidak ada session cookie di mobile.
Ketiga, di Laravel 11 alias middleware bawaan (auth, guest, throttle, verified) didaftarkan otomatis di bootstrap/app.php. Kalau kamu meng-upgrade dari Laravel 10 ke 11 dan masih mengutak-atik app/Http/Kernel.php, kamu sedang mengedit file yang sudah tidak dipakai. Kernel sudah digantikan konfigurasi di bootstrap/app.php.
Catatan teknis: Middleware bawaan menjawab pertanyaan "apakah request ini boleh lewat pintu?". Ia tidak menjawab "apakah user ini boleh menghapus data milik orang lain?" Itu wilayah policy dan gate (modul tersendiri). Memaksa middleware menjawab pertanyaan level data adalah sumber bug otorisasi paling umum: route-nya aman, datanya bocor.
Tantangan
Proteksi Berlapis
Buat 3 route: /masuk (middleware guest), /dashboard (auth), /dashboard/rahasia (auth + verified). Test ketiganya sebagai tamu, user biasa, dan user terverifikasi. Catat perilaku tiap kombinasi.