Смена алгоритма шифрования Laravel 8
Коллеги, имеется таблица с пользователями, там используется SHA256 для шифрования пароля.
Необходимо использовать этот пароль, для авторизации в laravel.
Для проверки авторизации в Laravel 8 используется Auth::attempt($credentials).
Как реализовать авторизацию с фасадом Auth, если в БД пароль зашифрован в SHA256?
Ответы (1 шт):
Автор решения: Владлен Вожжаев
→ Ссылка
Покурив три часа документацию всё-таки реализовал. Для выполнения такого финта нужно
Само собой должна быть модель вашей таблицы с пользователями.
Далее нужно создать своего провайдера который имплементирует методы
UserProviderclass CustomUserProvider implements UserProvider { protected $model; public function __construct($model) { $this->model = $model; } public function retrieveById($identifier): GenericUser { // тут ещё предстоит работа } public function retrieveByToken($identifier, $token) { return null; } public function updateRememberToken(Authenticatable $user, $token) { } public function retrieveByCredentials(array $credentials) { if (! array_key_exists('name', $credentials)) { return null; } $query = $this->newModelQuery(); foreach ($credentials as $key => $value) { if (Str::contains($key, 'pass')) { continue; } if (is_array($value) || $value instanceof Arrayable) { $query->whereIn($key, $value); } else { $query->where($key, $value); } } $userArray = $query->first()->getAttributes(); // GenericUser is a class from Laravel Auth System return new GenericUser($userArray); } public function validateCredentials(Authenticatable $user, array $credentials): bool { if (! array_key_exists('pass', $credentials)) { return false; } // Тут алгоритм проверки пароля. if ($user->getAuthPassword() == hash(64,$credentials['pass'],false)) return true; return false; } protected function newModelQuery($model = null) { return is_null($model) ? $this->createModel()->newQuery() : $model->newQuery(); } /** * Create a new instance of the model. * * @return \Illuminate\Database\Eloquent\Model */ public function createModel(): \Illuminate\Database\Eloquent\Model { $class = '\\'.ltrim($this->model, '\\'); return new $class; } }Далее регистрируем его в
Providers/AuthServiceProvider.phpAuth::provider('customuserprovider', function ($app, array $config) { return new CustomUserProvider($config['model']); });Далее добавляем его в конфигурации
config/auth.php'providers' => [ 'users' => [ 'driver' => 'customuserprovider', 'model' => App\Models\User::class, 'table' => 'TABLE_NAME', ], ],