Как хешировать пароль с помощью md5 вместо bcrypt в laravel 8?

Я хочу хэшировать пароль с помощью md5 вместо bcrypt в laravel 8. В моем контроллере входа в систему LoginController.php:

      protected function credentials(Request $request)
        {
            return ['user_name' => $request->{$this->username()}, 'password' => md5($request->password), 'actif' => 'Y'];
        }

И в моем UserController у меня есть:

      public function store(Request $request)
    {        
        $this->validationRules($request);        
        $user = new User();       
        $user->password = md5("00000000");
        $user->actif = 'Y';
        $user->user_name = $request->input('user_name');
        $user->save();

        return redirect('/users');
    }

Новый пользователь сохраняется в базе данных с помощью md5, но когда я пытаюсь войти в систему, он дает мне эту ошибку:

      These credentials do not match with our records

2 ответа

после прочтения кода ресурса вы обнаружите, что Laravel проверяет учетные данные пользователя в vendor/src/Illuminate/src/Auth/EloquentUserProvider

      public function validateCredentials(UserContract $user, array $credentials)
{
    $plain = $credentials['password'];
    return $this->hasher->check($plain, $user->getAuthPassword());
}
  1. Итак, сначала добавьте getAuthPassword функция в вашем Models/User.php
      class User extends Authenticatable
{
    public function getAuthPassword()
    {
        return ['password' => $this->attributes['password']];
    }
} 
  1. затем добавьте настраиваемое расширение от vendor/src/Illuminate/src/Auth/EloquentUserProvider.php
      namespace App\Libs;

use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Support\Str;

class SelfEloquentUserProvider extends EloquentUserProvider
{
    /**
     * Validate a user against the given credentials.
     *
     * @param \Illuminate\Contracts\Auth\Authenticatable $user
     * @param array $credentials
     */
    public function validateCredentials(Authenticatable $user, array $credentials)
    {
        $plain = $credentials['password'];
        $authPassword = $user->getAuthPassword();
 
        return hash_equals(md5($plain), $authPassword['password']);
    }
}
  1. затем зарегистрируйте свой SelfEloquentUserProvider в App/Providers/AppServiceProvider
      class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        \Auth::provider('self-eloquent', function ($app, $config) {
            return New \App\Libs\SelfEloquentUserProvider($app['hash'], $config['model']);
        });
    }
    ......
}
  1. наконец, в вашем config/auth.php
      'providers' => [
    'users' => [
        'driver' => 'self-eloquent',
        'model' => \App\User::class,
    ]
]

таким образом вы можете легко настроить собственное правило аутентификации.

Вам нужно написать контроллер LOGIN.

В Laravel 7 с пакетом AUTH ( Illuminate \Foundation\Auth\AuthenticatesUsers) вы переходите по адресу:

  • Http> Контроллеры> Auth> LoginController.php

И вам нужно переписать трейт AuthenticatesUsers следующим способом:

      protected function attemptLogin(Request $request)
{
    // Your login logic
}

Если вы используете другой пакет, метод будет другим, проверьте документацию вашего пакета, если это так.

Другие вопросы по тегам