Override the Password Validation Logic Laravel
So I have this database that uses the same logic for the user, but there's a slight difference between the hash. Previous DB is used by bcrypt node which is slidely different so we need to make custom user provider to handle this.
While $2b$
and $2y$
are functionally equivalent in terms of Bcrypt behavior, Laravel's implementation does not recognize $2b$
directly.
Step 1.1: Create a Custom User Provider
Create a new file:app/Auth/CustomUserProvider.php
<?php
namespace App\Auth;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Support\Facades\Hash;
class CustomUserProvider extends EloquentUserProvider
{
/**
* Validate a user's credentials.
*/
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
$hashedPassword = $user->getAuthPassword();
// Fix: Replace $2b$ with $2y$ dynamically for compatibility
if (strpos($hashedPassword, '$2b$') === 0) {
$hashedPassword = str_replace('$2b$', '$2y$', $hashedPassword);
}
return Hash::check($plain, $hashedPassword);
}
}
Step 1.2: Extend the Auth Service Provider
In AppServiceProvider.php
, bind the custom user provider:
use App\Auth\CustomUserProvider;
use Illuminate\Support\Facades\Auth;
public function boot()
{
// Register the custom user provider
Auth::provider('custom_user', function ($app, array $config) {
return new CustomUserProvider($app['hash'], $config['model']);
});
}
2. Modify Auth Configuration
In your config/auth.php
file, set the custom provider as the default user provider:
'providers' => [
'users' => [
'driver' => 'custom_user', // Use the custom user provider
'model' => App\Models\User::class,
],
],