Ana içeriğe geç

Permission Kılavuzu

Permission sisteminin kullanımı ve best practice'ler.

Genel Bakış

Permission sistemi, kullanıcıların belirli işlemleri gerçekleştirme yetkisini kontrol eder. Permission'lar rollere atanır ve kullanıcılar rolleri üzerinden permission'lara erişir.

Permission Kontrolü

Controller'da Permission Kontrolü

Controller metodlarında permission kontrolü yapılır:

public function index(Request $request)
{
$user = $request->user();

// Genel permission kontrolü
if (! $user->hasPermission('users.view')) {
return response()->json(['message' => 'Forbidden'], 403);
}

// ...
}

.own Permission Kontrolü

Kullanıcının sadece kendi kaynaklarını yönetmesi için:

public function show(Request $request, User $user)
{
$currentUser = $request->user();

// Genel permission veya .own permission kontrolü
if (! $currentUser->hasPermissionOrOwn('users.view', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}

// ...
}

Kaynak Sahibi Kontrolü

Kaynak sahibi kontrolü ile permission kontrolü:

public function update(Request $request, User $user)
{
$currentUser = $request->user();

// Kaynak sahibi kontrolü ile permission kontrolü
if (! $currentUser->canManageResource('users.update', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}

// ...
}

Permission Metodları

hasPermission(string $permissionSlug): bool

Kullanıcının belirli bir permission'a sahip olup olmadığını kontrol eder:

if ($user->hasPermission('users.manage')) {
// Kullanıcı users.manage permission'ına sahip
}

hasPermissionOrOwn(string $permissionSlug, Model $resource): bool

Kullanıcının genel permission'a veya .own permission'a sahip olup olmadığını kontrol eder:

if ($user->hasPermissionOrOwn('users.view', $targetUser)) {
// Kullanıcı users.view veya users.view.own permission'ına sahip
// VEYA kaynak sahibi
}

canManageResource(string $permissionSlug, ?Model $resourceOwner): bool

Kaynak sahibi kontrolü ile permission kontrolü yapar:

if ($user->canManageResource('users.update', $targetUser)) {
// Kullanıcı users.update permission'ına sahip
// VEYA kaynak sahibi ve users.update.own permission'ına sahip
}

Permission Pattern'leri

Standart Pattern'ler

PatternKullanımÖrnek
{module}.manageModül tam yetkiusers.manage
{module}.viewModül görüntülemeusers.view
{module}.view.ownKendi kaynaklarını görüntülemeusers.view.own
{module}.createModül oluşturmausers.create
{module}.create.ownKendi kaynaklarını oluşturmausers.create.own
{module}.updateModül güncellemeusers.update
{module}.update.ownKendi kaynaklarını güncellemeusers.update.own
{module}.deleteModül silmeusers.delete
{module}.delete.ownKendi kaynaklarını silmeusers.delete.own
{module}.restoreModül geri yüklemeusers.restore
{module}.restore.ownKendi kaynaklarını geri yüklemeusers.restore.own

Özel Pattern'ler

Bazı modüller özel permission pattern'leri kullanabilir:

  • admin.manage - Admin yönetim işlemleri
  • roles.assign - Rol atama
  • roles.revoke - Rol kaldırma
  • permissions.assign - Permission atama

Best Practice'ler

1. Permission Kontrolü Her Zaman Yapılmalı

Tüm protected endpoint'lerde permission kontrolü yapılmalı:

public function store(Request $request)
{
$user = $request->user();

// Permission kontrolü
if (! $user->hasPermissionOrOwn('users.create')) {
return response()->json(['message' => 'Forbidden'], 403);
}

// İş mantığı
// ...
}

2. .own Permission'ları Kullanın

Kullanıcıların kendi kaynaklarını yönetmesine izin vermek için .own permission'larını kullanın:

// Liste endpoint'inde
if (! $user->hasPermission('users.view') && $user->hasPermission('users.view.own')) {
$query->where('user_id', $user->id);
}

3. Sistem Rolleri Kontrolü

Sistem rolleri tüm permission kontrollerini bypass eder:

// Sistem rolü kontrolü (otomatik yapılır)
if ($user->hasPermission('users.manage')) {
// Sistem rolleri için otomatik true döner
}

4. Permission Hiyerarşisi

Permission'lar priority değerine göre sıralanır. Kullanıcılar sadece kendi seviyelerinden düşük permission'ları yönetebilir:

// Permission atama kontrolü
if (! $user->canManagePermission($targetPermission)) {
return response()->json(['message' => 'Forbidden'], 403);
}

Örnekler

Örnek 1: Liste Endpoint'i

public function index(Request $request)
{
$user = $request->user();

// Permission kontrolü
if (! $user->hasPermissionOrOwn('users.view')) {
return response()->json(['message' => 'Forbidden'], 403);
}

$query = User::query();

// Sadece .own permission'ı varsa, kendi kayıtlarını göster
if (! $user->hasPermission('users.view') && $user->hasPermission('users.view.own')) {
$query->where('id', $user->id);
}

return response()->json($query->paginate());
}

Örnek 2: Detay Endpoint'i

public function show(Request $request, User $user)
{
$currentUser = $request->user();

// Permission kontrolü
if (! $currentUser->canManageResource('users.view', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}

return response()->json($user);
}

Örnek 3: Güncelleme Endpoint'i

public function update(Request $request, User $user)
{
$currentUser = $request->user();

// Permission kontrolü
if (! $currentUser->canManageResource('users.update', $user)) {
return response()->json(['message' => 'Forbidden'], 403);
}

$validated = $request->validate([
'email' => 'sometimes|email',
// ...
]);

$user->update($validated);

return response()->json($user);
}

İlgili Dokümantasyon