5 Ocak 2026 - Tenant 1001 (Muzibu)
Problem: Muzibu'nun eski sisteminde kullanıcı şifreleri MD5 ile saklanıyordu. MD5 artık güvenli değil ve Laravel bcrypt kullanıyor.
Çözüm: Kullanıcı giriş yaptığında, eski şifresi otomatik olarak yeni güvenli formata çevriliyor. Kullanıcı hiçbir şey fark etmiyor, şifre değiştirmek zorunda kalmıyor.
Sonuç: Zamanla tüm kullanıcılar en az bir kez giriş yapacak ve şifreleri otomatik güncellenecek. Herkes geçiş yapınca bu sistemi kaldıracağız.
Ana migration servisi - tüm mantık burada
<?php
namespace App\Services\Auth;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
/**
* Legacy MD5 Password Migration Service
*
* ⚠️ GEÇİCİ SERVİS - Tüm kullanıcılar migrate olunca kaldırılacak!
*
* Arama: md5 muzibu eski şifreler migration
*/
class LegacyPasswordMigrationService
{
/**
* Migration aktif olan tenant'lar
*/
protected array $enabledTenants = [1001]; // Sadece Muzibu
/**
* Bu tenant için legacy migration aktif mi?
*/
public function isEnabled(): bool
{
return tenant() && in_array(tenant()->id, $this->enabledTenants);
}
/**
* MD5 hash mi kontrol et (32 karakter hex)
*/
public function isLegacyHash(string $hash): bool
{
return strlen($hash) === 32 && ctype_xdigit($hash);
}
/**
* Legacy şifre doğrula ve migrate et
*
* @return bool|null true=başarılı, false=yanlış şifre, null=legacy değil
*/
public function validateAndMigrate(Authenticatable $user, string $plainPassword): ?bool
{
// Tenant kontrolü
if (!$this->isEnabled()) {
return null;
}
$storedHash = $user->getAuthPassword();
// Legacy hash değilse normal auth'a bırak
if (!$this->isLegacyHash($storedHash)) {
return null;
}
// MD5 kontrolü
if (md5($plainPassword) !== $storedHash) {
return false;
}
// ✅ Şifreyi bcrypt'e migrate et
$user->password = Hash::make($plainPassword);
$user->save();
// Log tut (takip için)
Log::channel('single')->info('Legacy MD5 password migrated to bcrypt', [
'tenant_id' => tenant()->id,
'user_id' => $user->getAuthIdentifier(),
'user_email' => $user->email ?? 'N/A',
]);
return true;
}
/**
* Kaç kullanıcı hala MD5 kullanıyor? (İstatistik)
*/
public function getRemainingLegacyCount(): int
{
if (!$this->isEnabled()) {
return 0;
}
return \App\Models\User::whereRaw('LENGTH(password) = 32')->count();
}
}
Laravel auth sistemine bağlanır
<?php
namespace App\Auth;
use App\Services\Auth\LegacyPasswordMigrationService;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Support\Facades\Hash;
/**
* Legacy User Provider
*
* ⚠️ GEÇİCİ - MD5 migration tamamlanınca kaldırılacak!
*/
class LegacyUserProvider extends EloquentUserProvider
{
public function validateCredentials(Authenticatable $user, array $credentials): bool
{
$plainPassword = $credentials['password'];
// Legacy migration servisini çağır
$migrationService = app(LegacyPasswordMigrationService::class);
$result = $migrationService->validateAndMigrate($user, $plainPassword);
// null değilse sonucu döndür (true veya false)
if ($result !== null) {
return $result;
}
// Legacy değil → Normal Laravel auth
return Hash::check($plainPassword, $user->getAuthPassword());
}
}
Provider'ı Laravel'e tanıt
use App\Auth\LegacyUserProvider;
use Illuminate\Support\Facades\Auth;
public function boot(): void
{
// ... mevcut kodlar ...
// ⚠️ GEÇİCİ: MD5 Legacy Password Migration (Tenant 1001)
// Tüm kullanıcılar migrate olunca kaldırılacak!
Auth::provider('legacy', function ($app, array $config) {
return new LegacyUserProvider(
$app['hash'],
$config['model']
);
});
}
Auth driver'ı legacy olarak ayarla
'providers' => [
'users' => [
'driver' => 'legacy', // ⚠️ 'eloquent' → 'legacy' (GEÇİCİ)
'model' => App\Models\User::class,
],
],
1. Muzibu'da MD5 şifreli bir kullanıcı ile giriş yap
2. Giriş başarılı olmalı
3. Log kontrolü:
4. Database kontrolü (şifre 60 karakter olmalı):
⚠️ Ne Zaman Kaldırılır?
Tüm kullanıcılar en az bir kez giriş yaptığında. Kontrol komutu:
'driver' => 'legacy',
→
'driver' => 'eloquent',
boot() metodundan şu bloğu sil:
Auth::provider('legacy', function ($app, array $config) { ... });
Kaç kullanıcı migrate oldu?
Kaç kullanıcı hala MD5 kullanıyor?
Migration yüzdesi?
| Özellik | Değer |
|---|---|
| Etkilenen Tenant | Sadece 1001 (Muzibu) |
| Eski Hash | MD5 (32 karakter) |
| Yeni Hash | bcrypt (60 karakter) |
| Kullanıcı Fark Eder mi? | Hayır ✅ |
| Diğer Tenant'lar Etkilenir mi? | Hayır ✅ |
| Geçici mi? | Evet - İleride kaldırılacak |