CleanupPasswordResets.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use Illuminate\Support\Facades\DB;
  5. use Carbon\Carbon;
  6. use Illuminate\Support\Facades\Hash;
  7. use Illuminate\Support\Facades\Log;
  8. class CleanupPasswordResets extends Command
  9. {
  10. protected $signature = 'password:cleanup';
  11. protected $description = 'Clean up expired password reset tokens';
  12. public function handle()
  13. {
  14. try {
  15. $masterConfig = [
  16. 'driver' => 'mysql',
  17. 'host' => env('DB_HOST', '127.0.0.1'),
  18. 'port' => env('DB_PORT', '3306'),
  19. 'database' => env('DB_DATABASE'),
  20. 'username' => env('DB_USERNAME'),
  21. 'password' => env('DB_PASSWORD'),
  22. 'charset' => 'utf8mb4',
  23. 'collation' => 'utf8mb4_unicode_ci',
  24. 'prefix' => '',
  25. 'strict' => true,
  26. 'engine' => null,
  27. ];
  28. config(['database.connections.master_cleanup' => $masterConfig]);
  29. // Delete tokens older than 24 hours
  30. $deletedCount = DB::connection('master_cleanup')
  31. ->table('password_resets')
  32. ->where('created_at', '<', Carbon::now()->subHours(24))
  33. ->delete();
  34. DB::purge('master_cleanup');
  35. $this->info("Cleaned up {$deletedCount} expired password reset tokens.");
  36. } catch (\Exception $e) {
  37. $this->error("Failed to cleanup password reset tokens: " . $e->getMessage());
  38. }
  39. }
  40. }
  41. // ENHANCED AUTHENTICATION FUNCTION
  42. // Update your existing authentication function to handle password resets
  43. function authenticateUser($email, $password)
  44. {
  45. try {
  46. // Step 1: Get user from master database (current default connection)
  47. $masterUser = DB::table('users')->where('email', $email)->first();
  48. if (!$masterUser) {
  49. Log::info('User not found in master database', ['email' => $email]);
  50. return false;
  51. }
  52. // Step 2: Check password in master database
  53. if (!Hash::check($password, $masterUser->password)) {
  54. Log::info('Password incorrect in master database', ['email' => $email]);
  55. return false;
  56. }
  57. // Step 3: Set up tenant connection
  58. $tenantConfig = [
  59. 'driver' => 'mysql',
  60. 'host' => env('DB_HOST', '127.0.0.1'),
  61. 'port' => env('DB_PORT', '3306'),
  62. 'database' => $masterUser->tenant_database,
  63. 'username' => $masterUser->tenant_username,
  64. 'password' => $masterUser->tenant_password,
  65. 'charset' => 'utf8mb4',
  66. 'collation' => 'utf8mb4_unicode_ci',
  67. 'prefix' => '',
  68. 'strict' => true,
  69. 'engine' => null,
  70. ];
  71. // Add tenant connection to config
  72. config(['database.connections.tenant_check' => $tenantConfig]);
  73. // Step 4: Check user in tenant database
  74. $tenantUser = DB::connection('tenant_check')->table('users')->where('email', $email)->first();
  75. if (!$tenantUser) {
  76. Log::info('User not found in tenant database', [
  77. 'email' => $email,
  78. 'tenant_db' => $masterUser->tenant_database
  79. ]);
  80. return false;
  81. }
  82. // Step 5: Check password in tenant database
  83. if (!Hash::check($password, $tenantUser->password)) {
  84. Log::info('Password incorrect in tenant database', [
  85. 'email' => $email,
  86. 'tenant_db' => $masterUser->tenant_database
  87. ]);
  88. return false;
  89. }
  90. Log::info('Authentication successful in both databases', [
  91. 'email' => $email,
  92. 'tenant_db' => $masterUser->tenant_database
  93. ]);
  94. return $masterUser;
  95. } catch (\Exception $e) {
  96. Log::error('Authentication error', [
  97. 'email' => $email,
  98. 'error' => $e->getMessage(),
  99. 'trace' => $e->getTraceAsString()
  100. ]);
  101. return false;
  102. }
  103. }