Proje: OkulUp API · Hub: OkulUp API — Decisions

AuthorizationService — Merkezi Yetki Yaklaşımı

Karar

Tüm yetki kontrolleri (canAccessStudent, canAccessClass, validateStudentFilter vb.) tek bir servis sınıfında (AuthorizationService) toplanmıştır. Laravel Policy’leri kullanılmaz (Assignment Policy hariç — Laravel gate entegrasyonu için kısmi kullanım).

Neden

  • Multi-rol ve çok katmanlı veri izolasyonu (okul + sınıf + öğrenci) Laravel Policy’ye sığmıyor
  • getAccessibleStudentIds() gibi toplu scope metodları Policy’de doğal değil
  • Yetkisiz erişim loglama (logUnauthorizedAccess) merkezi olunca tutarlı
  • Controller’lar $authService->canAccessStudent(...) ile aynı mantığı tekrar etmiyor

Alternatifler

  • Laravel Policy: Her model için policy ayrı — sınıflar arası paylaşım zor
  • Inline controller logic: Tekrar kodu artırır, tutarsızlık riski

Nasıl Uygulanıyor

// DI ile inject:
public function __construct(
    private AuthorizationService $authService,
) {}
 
// Kullanım:
if (!$this->authService->canAccessStudent($user, $student->id)) {
    $this->authService->logUnauthorizedAccess($user, 'student', $student->id, 'academic_summary');
    return response()->json(['message' => '...'], 403);
}