Sorun Özeti
Muzibu (Tenant 1001) admin paneline ve Horizon'a giriş yapılamıyordu. Database'de ROOT yetkisi olmasına rağmen sürekli 403 Forbidden hatası alınıyordu.
📝 Basit Anlatım (Herkes İçin)
Ne Oldu?
Site yöneticileri (nurullah@nurullah.net ve info@turkbilisim.com.tr) admin paneline girmeye çalıştıklarında "Erişim Reddedildi" hatası alıyorlardı. Oysa database'de (veritabanı) tam yetkileri vardı.
Neden Oldu?
Laravel'in yetki sistemi (Spatie Permission), kullanıcı yetkilerini hızlı erişim için geçici hafızada (cache) tutuyor. Bu geçici hafıza bozulmuştu ve kullanıcıların yetkilerini göremiyordu. Sanki "Yöneticinin yetkilerini gösteren bir not kağıdı eskimiş ve okunamaz hale gelmişti."
Nasıl Çözüldü?
- Bozuk not kağıdı atıldı (cache temizlendi)
- Veritabanından yetkileri tekrar okutup yeni bir not yazıldı (syncRoles)
- Kullanıcıların eski oturumu kapatıldı (session silindi)
- Yeni oturum açtıklarında artık yeni, doğru yetkiler yüklendi
✅ Sonuç: Logout yapıp yeniden login olduktan sonra her şey düzeldi. Admin panel ve Horizon'a giriş yapılabildi.
🔧 Teknik Detaylar (Geliştiriciler İçin)
✓ Database Doğru'ydu
Dosya: tenant_muzibu_1528d0 database (tenant context)
✗ Spatie Permission Cache Bozuktu
Database'de rol atanmış olmasına rağmen Laravel runtime'da role relationship boş dönüyordu. Sebep: Spatie Permission cache'i Redis'te bozuk/eski format'ta saklanmıştı.
Session'da Eski User Object
Login olunduğunda user object session'a kaydedilmişti. Bu object'te roles = [] (boş array) vardı.
Her sayfa yüklendiğinde bu eski session'dan okunuyordu, dolayısıyla cache temizleme bile yeterli olmadı.
⚡ Uygulanan Çözüm
Tinker ile Role Sync
Etki: Spatie Permission cache'ini temizler ve role relationship'i fresh yükler
Redis FLUSHDB
Etki: Tüm Spatie cache + Laravel session + diğer cache'ler tamamen silindi
Cache Rebuild
Etki: Config cache rebuild + OPcache (PHP bytecode) reset
Logout + Login (Kullanıcı)
Kullanıcı logout yapıp yeniden login oldu. Bu sayede:
- Eski session silindi
- Yeni session oluştu
- Fresh user object + fresh roles yüklendi
💡 Neden Bu Çözüm İşe Yaradı?
❌ Önce (Bozuk)
✅ Sonra (Düzeltildi)
核心 (Core):
syncRoles() fonksiyonu
sadece database'e yazmadı, aynı zamanda Spatie Permission'ın internal cache'ini de temizledi.
Ardından Redis flush ve logout/login ile session'daki eski user object'i yenilendi.
Bu üçlü kombinasyon sorunu tamamen çözdü.
🛡️ Gelecek İçin Önlemler
Role değişikliklerinde cache temizle:
Role atama/çıkarma işlemlerinden sonra php artisan permission:cache-reset çalıştır.
Session süresi optimize et: Spatie Permission cache TTL'ini (24 saat) düşür veya session lifetime'ı gözden geçir.
Admin role değişikliği izni: Kritik roller (root, admin) değiştirildiğinde kullanıcıyı otomatik logout et.
Monitoring: AdminAccessMiddleware'de role check fail olduğunda log at (debug için).