Laravel İle Middleware Yetkilendirme Nasıl Yapılır?

Laravel İle Middleware Yetkilendirme Nasıl Yapılır?
Laravel İle Middleware Yetkilendirme Nasıl Yapılır?

Ö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) Cache mekanizması 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:

  1. Log Kayıtları: Middleware içerisine Log::info('Middleware tetiklendi', ['user_id' => $request->user()?->id]); ekleyerek akışı takip edin.
  2. 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.
  3. 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.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik konuları sadeleştirerek geniş kitlelere ulaştırma konusunda tutkuluyum. Ev işleri, bakım ve organizasyon temalı rehberlerimde kaliteyi ön planda tutuyorum.

Yorumlar (0)

Yorum Yaz