Yetkilendirme genellikle basit bir şekilde başlar, ancak proje büyüdükçe erişim kuralları hızla tekrarlanan ve tutarsız hale gelir. Laravel Policies bu sorunu, bir kaynağa kimlerin ne yapabileceğini tanımlamak için tek bir açık yer sağlayarak çözer.
Başlangıçta, birçok Laravel uygulaması erişim kurallarını hızlı kontrollerle yönetir:
- bir
ifkontrolü bir kontrolörde, - başka bir kontrol bir Blade görünümünde,
- belki bir hizmette bir koşul,
- ve (bazen) bir API uç noktasında eksik bir kontrol.
Birkaç hafta sonra, kurallar tekrarlanan, tutarsız ve güvenli bir şekilde değiştirilmesi zor hale gelir.
Laravel Policies bunu çözer; size verilen bir model (kaynak) üzerinde kimlerin ne yapabileceğini tanımlamak için tek bir açık yer sağlar.
Laravel’de Policy Nedir?
Laravel’de Policy Nedir?
Bir Policy, bir model etrafında yetkilendirme mantığını gruplayan bir sınıftır.
Örnekler:
-
ProjectPolicy→Projectiçin kurallar -
PostPolicy→Postiçin kurallar -
OrderPolicy→Orderiçin kurallar
Bir Policy, şu tür soruları yanıtlar:
- “Bu kullanıcı bu projeyi güncelleyebilir mi?”
- “Bu gönderiyi silebilirler mi?”
- “Bu siparişi görüntüleyebilirler mi?”
Kontrollerin her yerine yaymak yerine, kuralı bir kez Policy içinde tanımlar ve ardından authorize() / can() ile tutarlı bir şekilde yeniden kullanırsınız.
Neden Policies Önemlidir (Pratik Nedenler)
Neden Policies Önemlidir (Pratik Nedenler)
1) Tek bir doğruluk kaynağı
1) Tek bir doğruluk kaynağı
Bir kural = bir yer.
Artık kontrolörlerde ve görünümlerde tüm koşulları bulmak için avlanmaya gerek yok.
2) Uygulama genelinde tutarlılık
2) Uygulama genelinde tutarlılık
Aynı kural şunlarla uygulanır:
- web kontrolörleri,
- API kontrolörleri,
- Blade şablonları,
- işler,
- komutlar.
3) Daha az güvenlik riski
3) Daha az güvenlik riski
Yetkilendirme standart hale geldiğinde, bir rotada “bir kontrolün unutulması” daha zor hale gelir.
4) Geliştirilmesi daha kolay
4) Geliştirilmesi daha kolay
Kurallar sürekli değişiyor (“yöneticiler de düzenleyebilir”, “yalnızca premium kullanıcılar X yapabilir”).
Policies ile mantığı bir kez güncellersiniz.
Basit bir örnek: “Sahibi güncelleyebilir, yönetici her şeyi yapabilir”
Basit bir örnek: “Sahibi güncelleyebilir, yönetici her şeyi yapabilir”
Diyelim ki bir Project bir kullanıcıya ait. İstediğimiz:
- yöneticiler her projeyi güncelleyebilir,
- sahipler kendi projelerini güncelleyebilir.
Policy
Policy
// app/Policies/ProjectPolicy.php
namespace App\Policies;
use App\Models\Project;
use App\Models\User;
class ProjectPolicy
{
public function update(User $user, Project $project): bool
{
return $user->is_admin || $project->user_id === $user->id;
}
}
Bunu bir kontrolörde kullanın
Bunu bir kontrolörde kullanın
// app/Http/Controllers/ProjectController.php
use App\Models\Project;
class ProjectController
{
public function update(Project $project)
{
$this->authorize('update', $project);
// ... güncelleme mantığı
return back();
}
}
Temel iş akışı budur:
- Kontrolörünüz Laravel’e: “bu izinli mi?” diye sorar.
- Laravel Policy yöntemini (
update) çağırır. - Policy
trueveyafalsedöner.
Laravel doğru Policy’yi nasıl bulur?
Laravel doğru Policy’yi nasıl bulur?
Laravel modelleri policies ile eşler.
Seçenek A: Otomatik keşif
Seçenek A: Otomatik keşif
Eğer Policy’niz ProjectPolicy olarak adlandırılmış ve app/Policies dizininde yer alıyorsa, Laravel genellikle bunu otomatik olarak keşfeder (sürüm/yapılandırmanıza bağlı olarak).
Seçenek B: Açık eşleme
Seçenek B: Açık eşleme
Policies’i AuthServiceProvider içinde kaydedebilirsiniz:
// app/Providers/AuthServiceProvider.php
namespace App\Providers;
use App\Models\Project;
use App\Policies\ProjectPolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Project::class => ProjectPolicy::class,
];
public function boot(): void
{
$this->registerPolicies();
}
}
Kontroller dışında Policies Kullanımı
Kontroller dışında Policies Kullanımı
Policies sadece kontrolörler için değildir.
Blade’de
Blade’de
@can('update', $project)
Düzenle
@endcan
Kod içinde (hizmetler, işler, her yerde)
Kod içinde (hizmetler, işler, her yerde)
if (auth()->user()->can('update', $project)) {
// izinli
}
Gerçek Projeler için Temiz Bir Model
Gerçek Projeler için Temiz Bir Model
Basit bir kural yardımcı olur:
✅ Kontrolörler organize eder, Policies karar verir
✅ Kontrolörler organize eder, Policies karar verir
- Kontrolörler: isteği alır,
authorizeçağrısı yapar, eylemi gerçekleştirir. - Policies: erişim iş kuralını içerir.
- Hizmetler/Kullanım Senaryoları: gerçek işi yapar (isteğe bağlı, mimarinize bağlı olarak).
Bu, sorumlulukları net tutar ve “izin karmaşasını” önler.
İyi Policies Yazma İpuçları
İyi Policies Yazma İpuçları
- Yöntemleri küçük ve belirgin tutun (
view,create,update,delete). - Açık koşulları akıllı mantıktan üst tutun.
- İlişkileri temiz kullanın (
$project->team_id,$user->teams->contains(...)). - “rol + sahiplik + durum” kurallarını düşünün (SaaS’de çok yaygın).
Hızlı Kontrol Listesi
Hızlı Kontrol Listesi
- [ ] Her yazma eylemi kontrolörlerde
authorize()kullanır - [ ] Temel modeller (Project, Post, Order…) için Policies vardır
- [ ] Görünümler
@cankullanır, rasgele kontroller yerine - [ ] Eşleme yapılandırılmıştır (otomatik veya AuthServiceProvider)
- [ ] Testler birkaç kritik izni kapsar
Sonuç
Sonuç
Laravel Policies, yetkilendirmeyi korumanın en iyi yollarından biridir:
- merkezi (bir kural, bir yer),
- tutarlı (web, API, görünümler),
- daha güvenli (daha az unutulan kontroller),
- geliştirilmesi kolay.
Kaynak: Orijinal Makale
- Laravel’de Policy Nedir?
- Neden Policies Önemlidir (Pratik Nedenler)
- 1) Tek bir doğruluk kaynağı
- 2) Uygulama genelinde tutarlılık
- 3) Daha az güvenlik riski
- 4) Geliştirilmesi daha kolay
- Basit bir örnek: “Sahibi güncelleyebilir, yönetici her şeyi yapabilir”
- Laravel doğru Policy’yi nasıl bulur?
- Kontroller dışında Policies Kullanımı
- Gerçek Projeler için Temiz Bir Model
- İyi Policies Yazma İpuçları
- Hızlı Kontrol Listesi
- Sonuç


