Ön Hazırlık ve Gereksinimler
Başarılı bir uygulama geliştirmek için sisteminizde PHP 8.2 veya üzeri bir sürümün, Composer paket yöneticisinin ve hali hazırda kurulu bir Laravel projesinin bulunması gerekmektedir. Laravel'in sunduğu yerleşik kimlik doğrulama (authentication) sistemlerinden (Breeze veya Jetstream) birinin kurulu olması, middleware yetkilendirme süreçlerini test etmenizi kolaylaştıracaktır.
- PHP 8.2+ ve gerekli PHP eklentileri (bcmath, ctype, fileinfo, json, mbstring, openssl, pdo, tokenizer, xml)
- Composer 2.x sürümü
- Laravel 11+ framework kurulumu
- Veritabanı bağlantısı (MySQL veya PostgreSQL önerilir)
Adım 1: Özel Bir Middleware Oluşturma
Laravel'de middleware oluşturmak için Artisan komut satırı aracını kullanırız. Yetkilendirme için özel bir mantık kurmak istiyorsak, öncelikle bu sınıfı tanımlamamız gerekir. Örneğin, sadece "admin" yetkisine sahip kullanıcıların erişebileceği bir panel için EnsureUserIsAdmin adında bir middleware oluşturalım.
php artisan make:middleware EnsureUserIsAdmin
Bu komut, app/Http/Middleware dizini altında yeni bir dosya oluşturur. Bu sınıfın içerisinde yer alan handle metodu, isteğin uygulamaya devam edip etmeyeceğine karar veren ana mantığı barındırır.
Adım 2: Yetkilendirme Mantığını Kodlama
Oluşturduğumuz middleware sınıfının içerisine, kullanıcının admin olup olmadığını kontrol eden mantığı eklememiz gerekir. Laravel'in Auth facade'ını kullanarak oturum açmış kullanıcıya erişebilir ve veritabanındaki rol bilgisini kontrol edebiliriz.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class EnsureUserIsAdmin
{
public function handle(Request $request, Closure $next): Response
{
if ($request->user() && $request->user()->role !== 'admin') {
return redirect('dashboard')->with('error', 'Bu alana erişim yetkiniz yok.');
}
return $next($request);
}
}
Yukarıdaki kod bloğunda, kullanıcının giriş yapıp yapmadığını ve role sütununun 'admin' olup olmadığını kontrol ediyoruz. Eğer koşul sağlanmazsa, kullanıcıyı güvenli bir sayfaya yönlendiriyoruz. $next($request) ifadesi, yetki onaylandığında isteğin bir sonraki aşamaya (controller veya view) geçmesini sağlar.
Adım 3: Middleware Kaydı ve Tanımlanması
Laravel 11 sürümünde middleware tanımlamaları bootstrap/app.php dosyası üzerinden yönetilir. Oluşturduğumuz middleware'i uygulamaya tanıtmak için bu dosyayı düzenlememiz gerekir.
// bootstrap/app.php
return Application::configure(basePath: dirname(__DIR__))
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class,
]);
})->create();
Burada middleware sınıfımıza admin şeklinde kısa bir takma ad (alias) verdik. Bu sayede rotalarımızda uzun sınıf isimleri yerine bu kısa ismi kullanabileceğiz.
Adım 4: Middleware'i Rotalara Atama
Tanımladığımız middleware'i belirli rotalara veya rota gruplarına uygulamak oldukça basittir. routes/web.php dosyasında middleware metodunu kullanarak bu korumayı aktif hale getirebiliriz.
use Illuminate\Support\Facades\Route;
Route::middleware(['auth', 'admin'])->group(function () {
Route::get('/admin/dashboard', function () {
return view('admin.dashboard');
});
Route::get('/admin/settings', [AdminController::class, 'settings']);
});
Bu örnekte, hem auth (kullanıcı giriş yapmış mı?) hem de admin (kullanıcı yönetici mi?) middleware'leri aynı anda çalışmaktadır. İstek bu iki filtreden de başarıyla geçerse ilgili sayfaya ulaşabilir.
Karşılaştırma: Middleware vs Form Request vs Policy
Laravel'de yetkilendirme için farklı yaklaşımlar mevcuttur. İhtiyacınıza göre en doğru yöntemi seçmek için aşağıdaki tabloyu inceleyebilirsiniz.
| Yöntem | Kullanım Amacı | Avantajı |
|---|---|---|
| Middleware | Rota seviyesinde erişim kısıtlama | Hızlı ve merkezi yönetim |
| Form Request | İstek verisi doğrulama | Controller'ı temiz tutar |
| Policy | Model seviyesinde izin kontrolü | Detaylı ve esnek yetkilendirme |
Adım 5: Güvenlik Uyarıları ve En İyi Pratikler
Güvenlik Uyarısı: Middleware yetkilendirmesi, uygulamanızın ilk savunma hattıdır ancak tek başına yeterli değildir. Hassas veriler için her zaman Policy sınıflarını ve veritabanı seviyesinde sorgu kısıtlamalarını (Scope) kullanın. Asla kullanıcıdan gelen veriye (request input) güvenerek yetkilendirme kararı vermeyin.
Yaygın hatalardan biri, middleware içerisinde sadece URL kontrolü yapmaktır. Bunun yerine, her zaman veritabanındaki yetki sütunlarını baz alın. Ayrıca, hata mesajlarını kullanıcıya gösterirken sistem detaylarını ifşa etmemeye özen gösterin.
Sıkça Sorulan Sorular
Middleware rotada çalışmazsa ne yapmalıyım?
Öncelikle bootstrap/app.php içerisinde middleware'in doğru kaydedildiğinden emin olun. Ardından php artisan route:clear komutu ile rota önbelleğini temizleyin.
Bir middleware'i sadece belirli bir HTTP metodu için kullanabilir miyim?
Evet, middleware içerisinde $request->isMethod('post') kontrolü yaparak belirli metodlara özgü kısıtlamalar getirebilirsiniz.
Middleware'de parametre nasıl kullanılır?
Middleware sınıfındaki handle metoduna üçüncü bir parametre ekleyerek rotadan değer gönderebilirsiniz. Örneğin: public function handle(Request $request, Closure $next, $role).
Middleware sırasının bir önemi var mı?
Evet, Laravel middleware'leri tanımlandıkları sırayla çalıştırır. Önce kimlik doğrulama (auth), sonra yetkilendirme (admin) kontrolü yapılması güvenlik açısından zorunludur.
Middleware yerine Policy kullanmak daha mı iyidir?
Eğer yetkilendirme bir "kaynak" (resource) üzerindeyse (örneğin: bir gönderiyi düzenleme yetkisi), Policy kullanmak çok daha ölçeklenebilir bir yöntemdir.
Middleware Performans Optimizasyonu ve İleri İpuçları
Middleware katmanı, her HTTP isteğinde çalıştığı için uygulamanızın toplam yanıt süresine doğrudan etki eder. Özellikle veritabanı sorguları içeren yoğun middleware işlemleri, uygulamanızın yavaşlamasına neden olabilir. Performansı optimize etmek için şu stratejileri izleyebilirsiniz:
- Önbellekleme (Caching): Middleware içerisinde sık değişmeyen verileri (örneğin kullanıcı rolleri veya izinleri)
Cachemekanizması ile bellekte tutun. - Erken Dönüş (Early Return): Yetkilendirme mantığınızı mümkün olan en erken aşamada çalıştırın. Eğer kullanıcı yetkisizse, veritabanı sorgusu yapmadan önce
abort(403)ile işlemi sonlandırın. - Sorgu Optimizasyonu: Middleware içerisinde
User::find($id)gibi çağrılar yerine, zaten mevcut olan$request->user()nesnesini kullanın.
İleri seviye bir kullanım olarak, middleware'lerinize parametre geçerek dinamik bir yapı kurabilirsiniz. Örneğin, belirli bir role sahip kullanıcıları kontrol eden tek bir middleware şu şekilde tasarlanabilir:
public function handle($request, Closure $next, $role)
{
if (! $request->user() || ! $request->user()->hasRole($role)) {
abort(403, 'Bu işlem için yetkiniz yok.');
}
return $next($request);
}
Middleware Katmanında Hata Ayıklama (Debugging)
Middleware'ler uygulamanın "görünmez" kısmında çalıştığı için hata ayıklama süreci bazen zorlayıcı olabilir. Bir middleware'in beklediğiniz gibi çalışmadığını tespit ettiğinizde şu adımları izleyebilirsiniz:
- Log Kayıtları: Middleware içerisine
Log::info('Middleware tetiklendi', ['user_id' => $request->user()?->id]);ekleyerek akışı takip edin. - dd() Kullanımı: İstek middleware'e ulaştığında değişkenlerin içeriğini görmek için
dd($request->all());komutunu kullanın. Ancak bunu üretim ortamında yapmadığınızdan emin olun. - Middleware Listesini Kontrol Edin: Laravel'in hangi middleware'lerin çalıştığını listelemesini sağlamak için terminalde şu komutu kullanın:
php artisan route:list -v
Bu komut, rotalarınıza atanan tüm middleware'leri ve bunların çalışma sırasını detaylı bir tabloda gösterir. Eğer bir middleware'in neden çalışmadığını anlamıyorsanız, route:list çıktısında middleware'in ilgili rotaya doğru atanıp atanmadığını mutlaka kontrol edin.
Middleware Test Stratejileri
Güvenli bir uygulama için middleware'lerinizi birim testleri (unit tests) ile doğrulamak kritik öneme sahiptir. Laravel, withoutMiddleware() ve withMiddleware() yöntemleri ile test süreçlerini kolaylaştırır.
public function test_admin_middleware_yetkisiz_kullaniciyi_engeller()
{
$user = User::factory()->create(['is_admin' => false]);
$response = $this->actingAs($user)
->get('/admin/dashboard');
$response->assertStatus(403);
}
Bu test, standart bir kullanıcının admin paneline erişmeye çalıştığında 403 hatası alıp almadığını doğrular. Middleware testlerini yazarken, hem başarılı (yetkili) hem de başarısız (yetkisiz) senaryoları kapsayan test sınıfları oluşturmanız, uygulamanızın güvenliğini uzun vadede korumanızı sağlar.
Sonuç
Laravel ile middleware yetkilendirme, uygulamanızın güvenliğini sağlamak için temel bir yetenektir. Bu rehberde, özel bir middleware oluşturmayı, bunu sisteme kaydetmeyi ve rotalar üzerinde uygulamayı adım adım öğrendik. Middleware'ler, uygulamanızın giriş kapısındaki bekçiler gibidir; doğru yapılandırıldıklarında uygulamanızı yetkisiz erişimlerden korur. Bir sonraki adım olarak, Laravel Policy sınıflarını öğrenerek model bazlı yetkilendirme süreçlerini derinleştirebilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce tüm kodlarınızı güvenlik testlerinden geçirin ve güncel Laravel dokümantasyonunu takip edin. Yazılım güvenliği sürekli güncellenen bir alan olduğu için bağımlılıklarınızı (composer packages) düzenli olarak güncel tutmayı unutmayın.


Yorumlar (0)
Yorum Yaz