Birden fazla guard (web, api vb.) kullanan Laravel uygulamaları üzerinde çalışırken, ince ama kritik bir sorunla karşılaştım:
İzinler guardlar arasında sızıyordu.
Başlangıçta her şey yolunda gibi görünüyordu… ta ki sorun ortaya çıkana kadar.
Sorun
Durumu hayal edin:
Bir kullanıcının api guard altında bir izni var.
Biz bu izni web guard altında kontrol ediyoruz:
$user->hasPermissionTo(‘posts.edit’);
Ve bu doğru olmasa da true döndürüyor.
Bu, izin sisteminizin guard’ları doğru bir şekilde izole etmemesi durumunda gerçekleşir; bu durum, üretimde sessizce güvenlik sorunları yaratabilir.
Neden Bu Oluyor?
Çoğu uygulama, izin isimlerini küresel olarak benzersiz olarak ele alıyor:
posts.edit
Ama gerçekte, izinler guard bazında tanımlanmalıdır; yani:
web: posts.edit
api: posts.edit
Bu ayrım olmadan çakışmalar kaçınılmazdır.
Çözüm
Benim paketimin (laravel-permissions-redis) v2.0.0 sürümünde, izin sistemini tamamen guard bilgilendirilmiş hale getirecek şekilde yeniden tasarladım.
1. Guard-Bazlı İzin Kontrolleri
Tüm izin ve rol kontrolleri artık bir guard kabul ediyor:
$user->hasPermissionTo(‘posts.edit’, ‘api’);
$user->hasRole(‘admin’, ‘web’);
Ya da akıcı bir şekilde:
$user->forGuard(‘api’)->hasPermissionTo(‘posts.edit’);
2. Redis Depolama Yeniden Tasarımı
İzinler artık şu formatta depolanıyor:
guard|permission
Örnek:
api|posts.edit
web|posts.edit
Bu, guardlar arasında çakışmaları tamamen ortadan kaldırır.
3. Daha Akıllı Önbellekleme
Kontrolü geliştirerek sistemi daha ölçeklenebilir hale getirdim:
rewarmAll() → önbelleği temizlemeden yeniden oluştur
warmPermissionAffectedUsers() → sadece etkilenen kullanıcıları ısıt
getUserIdsAffectedByPermission() → kesin etki analizi
4. Performans İyileştirmeleri
Kullanıcıları ısıtırken tam tablo taraması yapılmıyor.
Redis yapılandırması artık dahili olarak önbelleğe alınıyor.
Middleware artık doğru guard’ı otomatik olarak çözüyor.
Önemli Değişiklikler
Yükseltme yapıyorsanız:
hasPermission() gibi yöntemler artık bir $guard kabul ediyor.
Redis anahtar formatı değişti → önbelleği temizlemeniz ve yeniden ısıtmanız gerekir.
Ana Nokta
Yetkilendirme hataları tehlikelidir çünkü uygulamanızı çökertmezler – sessizce erişim sağlarlar.
Guard izolasyonunu düzeltmek, sadece “güzel bir ek” değil, aşağıdaki sistemler için hayati önem arz etmektedir:
- API + Web uygulamaları
- Çoklu kimlik doğrulama yapıları
- Ölçeklenebilir mimariler
Son Düşünceler
Bu güncelleme tek bir şeye odaklandı:
Yetkilendirmeyi doğru, öngörülebilir ve ölçeklenebilir hale getirmek.
Laravel’de karmaşık izin sistemleriyle uğraşıyorsanız, bu yaklaşım size bazı zorlu hatalardan kurtulmanızı sağlayabilir.
Projenizde izinleri nasıl ele aldığınızı veya düşüncelerinizi duymaktan memnuniyet duyarım.
Kaynak: Orijinal Makale


