Laravel İle Kullanıcı Yetkilendirme Modülü Nasıl Yapılır?

Laravel İle Kullanıcı Yetkilendirme Modülü Nasıl Yapılır?
Laravel İle Kullanıcı Yetkilendirme Modülü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu rehberi uygulamak için sisteminizde PHP 8.2 veya üzeri bir sürümün, Composer paket yöneticisinin ve güncel bir Laravel 11+ projesinin kurulu olması gerekmektedir. Veritabanı olarak MySQL veya PostgreSQL kullanmanız önerilir.

  • Laravel 11.x veya üzeri sürüm.
  • PHP 8.2+ (Tip güvenliği ve performans için).
  • Composer (Bağımlılık yönetimi için).
  • Temel düzeyde SQL ve Laravel Eloquent bilgisi.

Laravel Policy (Politika) Yapısını Anlamak

Laravel'de yetkilendirme, "Policy" adı verilen sınıflar aracılığıyla yapılır. Her bir model veya iş mantığı için ayrı bir politika oluşturmak, kodun okunabilirliğini artırır. Policy, belirli bir eylemi gerçekleştirip gerçekleştiremeyeceğinizi kontrol eden bir mantık katmanıdır.

Öncelikle bir "Post" modeli için politika oluşturalım. Terminalinizde aşağıdaki komutu çalıştırın:

php artisan make:policy PostPolicy --model=Post

Bu komut, app/Policies/PostPolicy.php dosyasını oluşturacaktır. Bu dosya içerisinde, kullanıcıların gönderileri düzenleyip düzenleyemeyeceğini belirleyen mantığı tanımlayacağız.

Yetkilendirme Mantığını Kodlamak

Oluşturduğumuz PostPolicy sınıfı içerisinde, kullanıcının gönderi sahibi olup olmadığını kontrol eden bir metod yazalım. Bu, yetkilendirme mantığını merkezi bir noktada tutmamızı sağlar.

public function update(User $user, Post $post): bool
{
    // Kullanıcının ID'si gönderi sahibi ile aynı mı?
    return $user->id === $post->user_id;
}

Bu kod bloğu, update metoduna gelen $user ve $post nesnelerini karşılaştırır. Eğer kullanıcı gönderinin sahibi ise true döner, aksi takdirde false döner.

Controller İçinde Yetkilendirme Kontrolü

Policy'i tanımladıktan sonra, bunu Controller içerisinde kullanmamız gerekir. Laravel'in authorize metodu, yetki kontrolü başarısız olduğunda otomatik olarak 403 Forbidden hatası fırlatır.

public function update(Request $request, Post $post)
{
    // Yetki kontrolü yapılır
    $this->authorize('update', $post);

    $post->update($request->validated());

    return redirect()->route('posts.index')->with('success', 'Güncelleme başarılı.');
}

Burada $this->authorize('update', $post) satırı, PostPolicy içindeki update metodunu tetikler. Eğer kullanıcı yetkisiz ise, kodun devamı çalıştırılmaz ve kullanıcıya hata sayfası gösterilir.

Blade Şablonlarında Yetkilendirme

Kullanıcı arayüzünde, yetkisi olmayan birine "Düzenle" butonunu göstermek kötü bir kullanıcı deneyimidir. Laravel, Blade şablonlarında @can direktifi ile bunu kolayca yönetmemizi sağlar.

@can('update', $post)
    Düzenle
@endcan

Bu direktif, sadece PostPolicy içindeki update metodu true döndürdüğünde içerideki HTML kodunu işler. Böylece yetkisiz kullanıcılar butonu hiç görmezler.

Yetkilendirme Yöntemlerinin Karşılaştırılması

Laravel'de yetkilendirme için farklı yaklaşımlar mevcuttur. İhtiyacınıza göre en uygun yöntemi seçmelisiniz.

Yöntem Avantajı Dezavantajı
Gates Basit ve hızlı tanımlama. Büyük projelerde karmaşıklaşır.
Policies Modüler ve düzenli yapı. Dosya sayısı artar.
Spatie Roles Rol tabanlı hazır çözüm. Harici bağımlılık gerektirir.

Güvenlik Uyarısı: Yetkilendirme kontrollerini asla sadece arayüzde (Blade) yapmayın. Kullanıcılar URL'leri manuel olarak değiştirerek istek gönderebilirler. Her zaman Controller veya FormRequest seviyesinde yetki kontrolü yapıldığından emin olun.

Sıkça Sorulan Sorular

Policy dosyası otomatik olarak nasıl bağlanır?

Laravel, model ve policy isimleri uyumluysa (Post-PostPolicy) bunları otomatik olarak eşleştirir. Manuel bağlama yapmak isterseniz AuthServiceProvider içerisindeki $policies dizisini kullanabilirsiniz.

Admin kullanıcısına her şeye izin vermek için ne yapmalı?

AuthServiceProvider içerisinde Gate::before metodunu kullanarak tüm yetki kontrollerinden önce bir "admin" kontrolü ekleyebilir ve her zaman true dönebilirsiniz.

403 hatası aldığımda özel bir sayfa gösterebilir miyim?

Evet, resources/views/errors/403.blade.php dosyasını oluşturarak hata sayfasını tamamen özelleştirebilirsiniz.

Middleware ile yetkilendirme mümkün mü?

Evet, Route::middleware('can:update,post')->put(...) şeklinde route tanımlarında da yetkilendirme yapabilirsiniz.

Performans kaybı yaşar mıyım?

Laravel'in yetkilendirme sistemi oldukça hafiftir. Çok yoğun trafikli uygulamalarda Policy kontrollerini cache (önbellek) mekanizmasıyla optimize edebilirsiniz.

Yetkilendirme Süreçlerinde Birim Testi (Unit Testing)

Yetkilendirme mantığınızın hatasız çalıştığından emin olmanın en güvenilir yolu, bu kuralları test senaryoları ile doğrulamaktır. Laravel, actingAs metodu ile belirli bir kullanıcıyı simüle ederek Policy sınıflarınızın beklenen sonucu verip vermediğini kontrol etmenize olanak tanır.

Örnek bir test senaryosunda, bir kullanıcının kendisine ait olmayan bir gönderiyi düzenleyip düzenleyemeyeceğini şu şekilde test edebiliriz:

public function test_user_cannot_update_others_post()
{
    $user = User::factory()->create();
    $otherUser = User::factory()->create();
    $post = Post::factory()->create(['user_id' => $otherUser->id]);

    $response = $this->actingAs($user)
                     ->put("/posts/{$post->id}", ['title' => 'Yeni Başlık']);

    $response->assertStatus(403);
}

İleri Seviye: Yetkilendirme İçin Alternatif Kütüphaneler

Laravel'in yerleşik Policy yapısı orta ölçekli projeler için oldukça yeterlidir. Ancak, karmaşık "Rol ve İzin" (RBAC) sistemlerine ihtiyaç duyduğunuzda, veritabanı tabanlı yönetimi kolaylaştıran kütüphaneler iş yükünüzü hafifletebilir. En popüler seçeneklerden biri olan spatie/laravel-permission paketi, yetkilendirme mantığını veritabanı modellerine bağlayarak dinamik bir yönetim paneli oluşturmanıza olanak tanır.

Bu tür bir paket kullandığınızda, Policy sınıflarınızın yerini doğrudan model üzerindeki izin kontrolleri alabilir:

// Spatie paketi ile kullanım örneği
if ($user->can('edit articles')) {
    // Kullanıcının bu işleme izni var
}

// Veya Blade içerisinde
@can('edit articles')
    Düzenle
@endcan

Yetkilendirme Hatalarını Ayıklama (Debugging)

Yetkilendirme hataları bazen karmaşık olabilir. Özellikle 403 Forbidden hatası aldığınızda, sorunun hangi Policy metodundan kaynaklandığını bulmak için Laravel'in Gate sınıfını manuel olarak inceleyebilirsiniz. Geliştirme ortamında, app/Providers/AuthServiceProvider.php içerisine bir loglama mekanizması ekleyerek hangi kullanıcının hangi yetkiyi denediğini takip etmek oldukça faydalıdır.

İpucu: Eğer bir Policy metodunun neden false döndüğünü bulamıyorsanız, metodun içine dump() veya Log::info() ekleyerek gelen parametreleri (user ve model) kontrol etmeyi unutmayın.

Deployment Öncesi Güvenlik Kontrol Listesi

Uygulamanızı canlı ortama almadan önce yetkilendirme modülünüzün güvenliğini şu maddelerle teyit edin:

  • Policy Kaydı: AuthServiceProvider içerisinde tüm Policy sınıflarının doğru tanımlandığından emin olun.
  • Request Doğrulama: Yetkilendirme, girdi doğrulamanın (Validation) yerini tutmaz. Her zaman FormRequest kullanarak veriyi temizleyin.
  • Debug Modu: Canlı ortamda APP_DEBUG=false olduğundan emin olun; aksi takdirde hata detayları hassas bilgileri sızdırabilir.
  • Cache Temizliği: Policy değişikliklerinden sonra php artisan route:cache ve php artisan config:cache komutlarını çalıştırarak yapılandırmayı tazeleyin.

Sonuç

Laravel ile kullanıcı yetkilendirme modülü oluşturmak, projenizin güvenliğini sağlayan temel bir yapı taşıdır. Policy yapısını kullanarak kodunuzu temiz, sürdürülebilir ve güvenli tutabilirsiniz. Bu rehberde öğrendiğiniz authorize metodu ve @can direktifi, profesyonel bir Laravel uygulamasının olmazsa olmazlarıdır.

Kod güvenliği sorumluluk reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce girdi doğrulama (validation) ve SQL Injection koruması için Laravel'in sunduğu Eloquent ORM ve FormRequest özelliklerini mutlaka kullanın.

Bir sonraki adımda, bu yetkilendirme yapısını "Rol ve İzin" (RBAC - Role Based Access Control) mantığına genişleterek, kullanıcı gruplarına göre yetki atamaları yapmayı öğrenebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Deniz Aydın

On yıllık yaşam tarzı editörlüğü deneyimimle karmaşık süreçleri herkesin anlayabileceği basit adımlara dönüştürüyorum. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeye odaklanıyorum.

Yorumlar (0)

Yorum Yaz