Kullanıcı Rol Yönetimi Sorunu

Kritik Sorun Tespiti ve Çözümü

✓ ÇÖZÜLDÜ

10 Ocak 2026

📝 Basit Anlatım (Herkes İçin)

🔍 Sorun Ne İdi?

Kullanıcı yönetim panelinde (Admin Panel → Kullanıcılar) bir kullanıcının rolünü değiştirdiğimizde, kaydet butonuna bastıktan sonra değişiklikler yansımıyordu. Mesela bir kullanıcıyı "Normal Kullanıcı" yapıp kaydettiğimizde hala "Admin" olarak gözüküyordu. Ya da tam tersi, admin yetkisi verdiğimizde normal kullanıcı olarak kalıyordu.

🎯 Gerçek Neden

Sistemin "kullanıcı etiketleme" mekanizmasında bir uyumsuzluk vardı. Şöyle ki:

  • Sistem, kullanıcıları "User" etiketi ile kaydetmesi gerekiyordu
  • Ama veritabanına "App\Models\User" olarak yazılıyordu
  • Bu yüzden sistem, kaydedilen rolleri bulamıyordu (yanlış etiketle arıyordu)

✅ Nasıl Çözüldü?

  1. 1
    Yanlış kayıtlar temizlendi:

    Veritabanındaki tüm "App\Models\User" etiketli kayıtlar silindi.

  2. 2
    Kaydetme sistemi düzeltildi:

    Artık roller "User" etiketi ile (doğru format) kaydediliyor.

  3. 3
    Arama sistemi güncellendi:

    Sistem artık doğru etiket ("User") ile rolleri arıyor.

🎉 Sonuç

Artık kullanıcı rolü değiştirme işlemi sorunsuz çalışıyor. Bir kullanıcıyı admin yapabilir, editör yapabilir veya normal kullanıcıya çevirebilirsiniz. Kaydet butonuna bastığınızda değişiklikler anında yansıyor ve doğru rol bilgisi gösteriliyor.

🔧 Teknik Detaylar (Geliştiriciler İçin)

🔍 Sorun Analizi

Gözlemlenen Davranış:

  • DB::table('model_has_roles')->where('model_type', 'App\Models\User')->delete() → Hiçbir kayıt silinmiyor
  • DB::table('model_has_roles')->where('model_type', 'User')->delete() → Kayıtlar siliniyor

Kök Neden:

// app/Providers/AppServiceProvider.php:114

Relation::morphMap([

'User' => \App\Models\User::class,

]);

// ❌ Sorun: Component 'App\Models\User' yazıyordu

// ✅ Çözüm: MorphMap 'User' kullanıyor

SQL Binding Analizi:

SQL Query:

SELECT * FROM roles WHERE model_type = ?

❌ Binding: ["User"] → DB'de "App\Models\User" var → 0 sonuç

✅ Düzeltme sonrası: ["User"] → DB'de "User" var → 1 sonuç

⚙️ Uygulanan Çözümler

ÇÖZÜM 1

Veritabanı Temizliği

Duplicate ve yanlış model_type kayıtları temizlendi:

DELETE FROM model_has_roles
WHERE model_type = 'App\Models\User';

→ 6 yanlış kayıt silindi

ÇÖZÜM 2

Component Güncelleme

📁 Dosya:

Modules/UserManagement/app/Http/Livewire/UserManageComponent.php

❌ Eski Kod:

DB::table('model_has_roles')->insert([
    'role_id' => $role->id,
    'model_type' => User::class, // "App\Models\User"
    'model_id' => $user->id
]);

✅ Yeni Kod:

DB::table('model_has_roles')->insert([
    'role_id' => $role->id,
    'model_type' => 'User', // morphMap uyumlu
    'model_id' => $user->id
]);
ÇÖZÜM 3

User Model Cache Yönetimi

📁 Dosya:

app/Models/User.php

Yeni Method Eklendi:

public function flushRoleCache(): void
{
    app(\Spatie\Permission\PermissionRegistrar::class)
        ->forgetCachedPermissions();

    $this->unsetRelation('roles');
    $this->unsetRelation('permissions');

    \Cache::forget("user_{$this->id}_roles");
    \Cache::forget("user_{$this->id}_permissions");
}
ÇÖZÜM 4

Query Standardizasyonu

Tüm model_type sorguları morphMap uyumlu hale getirildi:

// Rol silme
->where('model_type', 'User')

// Rol arama
->where('model_type', 'User')

// Rol ekleme
'model_type' => 'User'

✅ Test Sonuçları

Veritabanı Durumu

Rol kayıt formatı: User ✓
Duplicate kayıt: Yok ✓
Yanlış format: Temizlendi ✓

Eloquent Performansı

roles()->count(): Doğru ✓
hasRole('admin'): Doğru ✓
Cache temizliği: Çalışıyor ✓

Test Senaryoları:

  • Admin → Normal Kullanıcı (Rol kaldırma)
  • Normal Kullanıcı → Admin (Rol atama)
  • Admin → Editör (Rol değiştirme)
  • Sayfa yenileme sonrası doğru rol görüntüleme

📂 Değiştirilen Dosyalar

1.
app/Models/User.php

+ flushRoleCache() method

+ roles() method: ->withoutGlobalScopes()

2.
Modules/UserManagement/app/Http/Livewire/UserManageComponent.php

handleRoleAndPermissions(): model_type standardizasyonu

Tüm sorgular 'User' (morphMap uyumlu) kullanıyor

💡 Öğrenilen Dersler

1. Laravel MorphMap Kullanımı

Polymorphic relationship'lerde morphMap tanımlandıysa, veritabanına yazma ve okuma işlemlerinde aynı format kullanılmalı. Aksi halde query binding uyumsuzluğu oluşur.

2. Cache Yönetimi

Spatie Permission'da rol değişikliklerinde Eloquent relationship cache'i temizlenmeli. Sadece global permission cache değil, model-level cache de flush edilmeli.

3. Veritabanı Tutarlılığı

model_type gibi polymorphic anahtar sütunlarda format tutarsızlığı (duplicate formatlar) ciddi sorunlara yol açabilir. Düzenli data audit gerekli.

4. Debugging Yaklaşımı

Eloquent sorgusu doğru ama sonuç yanlışsa, SQL binding'leri kontrol et. Raw SQL query ile Eloquent sonuçlarını karşılaştır.