Laravel Middleware Derinlemesine: Kimlik Dogrulama, Rate Limiting ve Ozel Middleware
Laravel middleware hakkinda kapsamli rehber - kimlik dogrulamadan rate limitinge, ozel middleware siniflari olusturmaya kadar. Pratik kod ornekleri ve uretim ortami desenleri.

Laravel middleware, gelen HTTP istekleri ile uygulama mantigi arasinda bir filtreleme katmani gorevi gorur. Her istek, bir kontrolore ulasmadan once bir middleware siniflar potasinden gecer ve her yanit ayni potas uzerinden geri doner. Bu mekanizmayi anlamak, 2026 yilinda guvenli ve performansli Laravel uygulamalari gelistirmek icin son derece onemlidir.
Middleware, HTTP isteklerini rotalara ulasmadan once yakalar. Laravel 12, tum middleware kayitlarini bootstrap/app.php dosyasinda akici bir API ile gerceklestirir. Yerlesik middleware, kimlik dogrulama, CSRF korumasi, oturum yonetimi ve rate limiting islemlerini kutudan cikar cikmaz destekler.
Laravel Middleware Pipeline Nasil Calisir
Laravel HTTP cekirdegi her istegi bir middleware yigini uzerinden isler. Her middleware, istegi alir, kendi mantigini calistirir ve ardindan istegi $next($request) araciligiyla bir sonraki katmana iletir ya da dogrudan bir yanit dondurerek potayi keser.
Bu mimari, Sorumluluk Zinciri (Chain of Responsibility) desenini takip eder. Middleware, istek kontrolore ulasmadan once (ornegin kimlik dogrulama kontrolleri), yanit olusturulduktan sonra (ornegin baslik ekleme) veya her iki durumda da calisabilir.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;
class LogRequestTime
{
public function handle(Request $request, Closure $next): Response
{
$start = microtime(true); // Capture start time
$response = $next($request); // Pass to next middleware
$duration = microtime(true) - $start;
Log::info('Request completed', [
'url' => $request->url(),
'method' => $request->method(),
'duration' => round($duration * 1000, 2) . 'ms',
]);
return $response; // Return response up the stack
}
}Bu middleware istegi sarar: isleme baslamadan once baslangic zamanini kaydeder ve yanit geri geldikten sonra sureyi loglar. Bu once/sonra deseni, middleware calisma prensibinin temelidir.
Kimlik Dogrulama Middleware: Rotalari Koruma
Laravel, Illuminate\Auth\Middleware\Authenticate ile eslesmis auth middleware aliasini sunar. Bunu bir rotaya uygulamak, yalnizca kimlik dogrulanmis kullanicilarin erisebilmesini saglar. Dogrulanmamis kullanicilar 401 yaniti (API) veya giris sayfasina yonlendirme (web) alir.
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\ProfileController;
// Single route protection
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth');
// Group protection for multiple routes
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'show']);
Route::put('/profile', [ProfileController::class, 'update']);
Route::delete('/profile', [ProfileController::class, 'destroy']);
});Coklu Guard ile Kimlik Dogrulama
Birden fazla kullanici tipine sahip uygulamalar (yonetim paneli, musteri alani, API), guard tabanli kimlik dogrulamadan yararlanir. auth middleware, hangi kimlik dogrulama surucusunun kullanilacagini belirten bir guard parametresi kabul eder.
// API routes use the 'sanctum' guard
Route::middleware('auth:sanctum')->group(function () {
Route::get('/user', fn (Request $request) => $request->user());
Route::apiResource('/orders', OrderController::class);
});
// routes/web.php
// Admin routes use a custom 'admin' guard
Route::middleware('auth:admin')->prefix('admin')->group(function () {
Route::get('/dashboard', [AdminController::class, 'index']);
Route::get('/users', [AdminController::class, 'users']);
});Iki noktadan sonraki guard parametresi, Laravel'e hangi kimlik dogrulama yapilandirmasina karsi dogrulama yapilacagini bildirir. Bu, kimlik dogrulama mantiginin uygulamanin farkli bolumleri arasinda temiz ve ayri kalmasini saglar.
guest middleware, auth middleware'in tersidir — yalnizca kimlik dogrulanmamis kullanicilari gecirir. Giris ve kayit rotalarina uygulandiginda, zaten oturum acmis kullanicilarin bu sayfalara erismesini engeller.
Throttle Middleware ile Rate Limiting
Laravel'de middleware rate limiting, yerlesik throttle middleware ile rotalari kotuye kullanimdan korur. En basit formu iki parametre kabul eder: maksimum istek sayisi ve dakika cinsinden zaman penceresi.
// Allow 60 requests per minute per user
Route::middleware('throttle:60,1')->group(function () {
Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{post}', [PostController::class, 'show']);
});
// Stricter limit for write operations
Route::middleware(['auth:sanctum', 'throttle:10,1'])->group(function () {
Route::post('/posts', [PostController::class, 'store']);
Route::put('/posts/{post}', [PostController::class, 'update']);
});Gelismis Kontrol icin Adlandirilmis Rate Limiterler
AppServiceProvider icerisinde adlandirilmis rate limiterler tanimlamak, kullanici baglamina gore limitler uzerinde hassas kontrol saglar. Bu yaklasim, satir ici throttle parametrelerinden cok daha esnektir.
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Http\Request;
public function boot(): void
{
// API rate limiter with tiered access
RateLimiter::for('api', function (Request $request) {
$user = $request->user();
if ($user?->hasSubscription('enterprise')) {
return Limit::perMinute(500)->by($user->id); // Enterprise: 500/min
}
if ($user) {
return Limit::perMinute(100)->by($user->id); // Authenticated: 100/min
}
return Limit::perMinute(20)->by($request->ip()); // Anonymous: 20/min
});
// Login limiter to prevent brute force
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)
->by($request->ip()) // Key by IP address
->response(function () { // Custom exceeded response
return response()->json([
'message' => 'Too many login attempts. Try again in a minute.',
], 429);
});
});
}Adlandirilmis limiterleri rotalara uygulamak throttle:isim sozdizimini kullanir:
Route::middleware('throttle:api')->group(function () {
Route::apiResource('/posts', PostController::class);
});
// routes/web.php
Route::middleware('throttle:login')
->post('/login', [AuthController::class, 'login']);Yukaridaki katmanli rate limiter bir uretim ortami desenini gosterir: enterprise kullanicilar daha yuksek limitler alir, kimlik dogrulanmis kullanicilar orta duzey limitlerle sinirlandirilir ve anonim istekler agresif sekilde kisitlanir. by() metodu rate limit anahtarini belirler — kimlik dogrulanmis kullanicilar icin kullanici ID'si ve yedek olarak IP adresi kullanilir.
Laravel mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
Sifirdan Ozel Middleware Olusturma
Ozel middleware olusturmak, yerlesik middleware'in kapsamadiigi senaryolari ele alir. make:middleware Artisan komutu, dogru yapiyla yeni bir sinif olusturur.
php artisan make:middleware EnsureUserHasRoleRol Tabanli Erisim Kontrolu Middleware
Yaygin bir ozel middleware deseni, rota duzeyinde rol tabanli yetkilendirmeyi zorunlu kilar ve parametre olarak rol adlarini kabul eder.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class EnsureUserHasRole
{
public function handle(Request $request, Closure $next, string ...$roles): Response
{
$user = $request->user();
if (! $user || ! $user->hasAnyRole($roles)) {
abort(403, 'Insufficient permissions.');
}
return $next($request);
}
}Variadic ...$roles parametresi, virgullerle ayrilmis birden fazla rolun gecilmesine olanak tanir. Kayit ve kullanim su sekildedir:
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'role' => \App\Http\Middleware\EnsureUserHasRole::class,
]);
})
// routes/web.php
Route::middleware('role:admin')->group(function () {
Route::get('/admin', [AdminController::class, 'index']);
});
// Multiple roles: admin OR editor can access
Route::middleware('role:admin,editor')->group(function () {
Route::resource('/articles', ArticleController::class);
});Istek Donusturme Middleware
Middleware, istegi kontrolore ulasmadan once degistirebilir. JSON API icin content type basliklarini zorunlu kilan ve string girdileri kesen bir middleware ornegi:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class ApiRequestSanitizer
{
public function handle(Request $request, Closure $next): Response
{
// Reject non-JSON requests on API routes
if (! $request->expectsJson() && $request->isMethod('POST')) {
return response()->json(
['error' => 'Content-Type must be application/json'],
415
);
}
// Trim all string inputs
$input = $request->all();
array_walk_recursive($input, function (&$value) {
if (is_string($value)) {
$value = trim($value);
}
});
$request->merge($input);
return $next($request);
}
}Bu middleware iki konuyu ele alir: POST istekleri icin icerik tipini dogrular ve tum string girdilerini bosluk karakterlerinden temizler.
Laravel 12'de Middleware Kaydi
Laravel 12, tum middleware kaydini bootstrap/app.php dosyasinda merkezilestirmistir. Bu, Laravel 11 oncesinde var olan eski app/Http/Kernel.php yaklasiminin yerini almistir.
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withMiddleware(function (Middleware $middleware) {
// Global middleware (runs on every request)
$middleware->append(
\App\Http\Middleware\LogRequestTime::class
);
// Add to the 'web' middleware group
$middleware->web(append: [
\App\Http\Middleware\TrackPageViews::class,
]);
// Add to the 'api' middleware group
$middleware->api(prepend: [
\App\Http\Middleware\ApiRequestSanitizer::class,
]);
// Register aliases for route-level use
$middleware->alias([
'role' => \App\Http\Middleware\EnsureUserHasRole::class,
'subscribed' => \App\Http\Middleware\EnsureUserIsSubscribed::class,
]);
// Control execution order
$middleware->priority([
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
\App\Http\Middleware\EnsureUserHasRole::class,
]);
})
->create();priority dizisi, ayni rotaya birden fazla middleware atandiginda onem kazanir. Laravel bunlari bu listeye gore siralar; oturumun kimlik dogrulamadan once baslatilmasini ve kimlik dogrulamanin rol kontrollerinden once tamamlanmasini saglar.
Middleware, kayit sirasina gore calisir. Rota duzeyindeki middleware icin priority dizisi varsayilan sirayi gecersiz kilar. Kimlik dogrulanmamis isteklerde rol kontrolu yapmaktan kacinmak icin kimlik dogrulama her zaman yetkilendirmeden once yerlestirilmelidir.
Yanit Sonrasi Gorevler icin Terminable Middleware
Terminable middleware, yanit istemciye gonderildikten sonra mantik calistirir. Bu, kullaniciyi engellememen gereken loglama, analitik veya temizlik gorevleri icin kullanislidir.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;
class CollectAnalytics
{
public function handle(Request $request, Closure $next): Response
{
return $next($request); // Pass through without delay
}
public function terminate(Request $request, Response $response): void
{
// Runs after response is sent to client
DB::table('analytics')->insert([
'path' => $request->path(),
'method' => $request->method(),
'status_code' => $response->getStatusCode(),
'user_id' => $request->user()?->id,
'ip' => $request->ip(),
'created_at' => now(),
]);
}
}terminate metodu hem orijinal istegi hem de nihai yaniti alir. Ayni ornegin hem handle() hem de terminate() islemlerini yonetmesini saglamak icin middleware'i AppServiceProvider icerisinde singleton olarak kaydetmek gerekir.
Uretim Ortaminda Pratik Middleware Desenleri
Birkac middleware deseni, uretim ortamindaki Laravel uygulamalarinda tutarli sekilde kullanilir.
Bakim modu gecisi — bakim sirasinda dahili IP adreslerinin uygulamaya erismesine izin verir:
class MaintenanceBypass
{
private array $allowedIps = ['192.168.1.0/24', '10.0.0.1'];
public function handle(Request $request, Closure $next): Response
{
if (app()->isDownForMaintenance()) {
foreach ($this->allowedIps as $ip) {
if ($request->ip() === $ip) {
return $next($request);
}
}
}
return $next($request);
}
}Guvenlik basliklari — her yanita HSTS, icerik guvenlik politikasi ve diger basliklari ekler:
class SecurityHeaders
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Content-Type-Options', 'nosniff');
$response->headers->set('X-Frame-Options', 'SAMEORIGIN');
$response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
$response->headers->set(
'Strict-Transport-Security',
'max-age=31536000; includeSubDomains'
);
return $response;
}
}Bu desenler iki temel middleware konumunu gosterir: istekten once (bakim modu gecisi IP'yi kontrol eder ve potansiyel olarak engeller) ve yanittan sonra (guvenlik basliklari giden yaniti degistirir).
Laravel mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
Sonuc
- Laravel middleware bir potas olarak calisir: her sinif istegi isler, uzerinde islem yapar ve ileri iletir veya bir yanitla zinciri keser
authmiddleware, guard tabanli kimlik dogrulama ile rotalari korur veauth:guardsozdizimi ile birden fazla kullanici tipini desteklerthrottlemiddleware ve adlandirilmisRateLimiter::for()tanimlari araciligiyla rate limiting, kullanici baglamina dayali katmanli erisim kontrolu saglar- Ozel middleware, rol kontrolleri, istek sanitizasyonu ve guvenlik basliklari gibi capraz kesim konularini kontrolorleri karistirmadan ele alir
- Laravel 12'de tum middleware kaydi
bootstrap/app.phpicerisinde akici bir API ile yapilir veprioritycalistirma sirasini kontrol eder - Terminable middleware, yanit sonrasi gorevleri (analitik, loglama) kullaniciya yonelik gecikmeyi etkilemeden calistirir
:paramsozdizimi ile middleware parametreleri, rota tanimlarini ifade edici tutar ve middleware siniflarini farkli baglamlarda yeniden kullanilabilir kilar
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Etiketler
Paylaş
İlgili makaleler

2026 Yilinda En Cok Sorulan 25 Laravel ve PHP Mulakat Sorusu
Laravel mulakat sorulari: Service Container, Eloquent ORM, middleware, kuyruklar, guvenlik, test ve mimari desenler hakkinda 25 soru ve kod ornekleriyle kapsamli bir rehber.

Laravel 11: Sifirdan Eksiksiz Bir Uygulama Gelistirme
Kimlik dogrulama, REST API, Eloquent ORM ve production dağıtımı ile Laravel 11 uygulaması geliştirme rehberi. Başlangıç ve orta seviye geliştiriciler için pratik eğitim.

Symfony 7: API Platform ve En Iyi Uygulamalar
Symfony 7 ve API Platform 4 ile profesyonel REST API'leri gelistirmek icin kapsamli rehber. State Provider'lar, Processor'lar, dogrulama ve serializasyon orneklerle aciklanmistir.