Laravel İle Middleware Kullanarak Özel Yetkilendirme Katmanı Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu eğitimi uygulayabilmek için sisteminizde PHP 8.2 veya üzeri bir sürümün ve Laravel 11.x veya güncel bir sürümün yüklü olması gerekmektedir. Ayrıca, veritabanı işlemlerini yönetebilmek için temel düzeyde Eloquent ORM bilgisine sahip olmanız süreci hızlandıracaktır.

  • PHP 8.2+
  • Composer paket yöneticisi
  • Laravel 11+ projesi
  • Temel veritabanı (MySQL veya PostgreSQL)

Projenizin kurulu olduğundan emin olduktan sonra terminal üzerinden gerekli middleware dosyasını oluşturmaya başlayabiliriz.

Adım 1: Özel Middleware Oluşturma

Laravel'de bir middleware oluşturmak için Artisan komut satırı aracını kullanırız. "RoleMiddleware" adında bir sınıf oluşturarak, kullanıcıların rollerini kontrol edecek yapıyı kurmaya başlayalım.

php artisan make:middleware EnsureUserHasRole

Bu komut, app/Http/Middleware dizini altında EnsureUserHasRole.php dosyasını oluşturacaktır. Bu dosya, tüm isteklerin geçeceği handle metodunu barındırır.

Adım 2: Middleware İçerisinde Yetkilendirme Mantığını Kurma

Middleware dosyasını açın ve gelen isteğin (request) kullanıcı rolünü kontrol etmesini sağlayın. Burada, kullanıcının veritabanındaki rolü ile beklenen rolü karşılaştıracağız.




Adım 3: Middleware'i Kernel'a veya Route Gruplarına Kaydetme

Middleware'inizi oluşturup mantığını kurduktan sonra, Laravel'in bu katmanı tanıması için kaydetmeniz gerekir. Laravel 11 ve sonraki sürümlerde bu işlem bootstrap/app.php dosyası üzerinden, daha eski sürümlerde ise app/Http/Kernel.php üzerinden yapılır.

Modern Laravel yapısında middleware'i bir takma ad (alias) ile tanımlamak en iyi pratiktir:

// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->alias([
        'role' => \App\Http\Middleware\EnsureUserHasRole::class,
    ]);
})

Artık bu middleware'i rotalarınızda şu şekilde kullanabilirsiniz:

Route::get('/admin/dashboard', function () {
    // Sadece 'admin' rolüne sahip kullanıcılar erişebilir
})->middleware('role:admin');

Adım 4: Hata Ayıklama ve İstisnaları Yönetme

Yetkilendirme başarısız olduğunda kullanıcıya standart bir 403 hatası göstermek yerine, özel bir yönlendirme veya hata mesajı döndürmek kullanıcı deneyimini iyileştirir. EnsureUserHasRole sınıfınızın handle metodunu şu şekilde güncelleyerek daha esnek bir yapı kurabilirsiniz:

public function handle(Request $request, Closure $next, $role)
{
    if (!$request->user() || !$request->user()->hasRole($role)) {
        // Kullanıcı yetkisiz ise ana sayfaya yönlendir ve hata mesajı ekle
        return redirect('/home')->with('error', 'Bu sayfaya erişim yetkiniz bulunmamaktadır.');
    }

    return $next($request);
}

İleri İpuçları: Çoklu Rol Kontrolü

Bazen bir rotaya birden fazla rolün erişmesini isteyebilirsiniz. Middleware'inizi, parametre olarak gelen rolleri bir dizi olarak kabul edecek şekilde geliştirmek, kodunuzun tekrar kullanılabilirliğini artırır.

// Middleware içerisinde çoklu rol kontrolü
public function handle(Request $request, Closure $next, ...$roles)
{
    if (!$request->user() || !in_array($request->user()->role, $roles)) {
        abort(403, 'Yetkisiz erişim.');
    }

    return $next($request);
}

// Rota kullanımı
Route::get('/panel', function () {
    // Admin veya Editor erişebilir
})->middleware('role:admin,editor');

Bu yaklaşım, karmaşık yetkilendirme gereksinimlerini tek bir middleware üzerinden yönetmenize olanak tanır ve projenizin bakımını kolaylaştırır.

Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Sürdürülebilir yaşam ve pratik ev yönetimi üzerine içerik stratejileri geliştiriyorum. Yalın anlatımı ve uygulanabilirliği ön planda tutan bir yazı dilim var.

Yorumlar (0)

Yorum Yaz