Метод needsRehash
Метод needsRehash класса UserPasswordHasher
проверяет, требуется ли повторное хеширование
пароля пользователя. Первым параметром передаётся
объект пользователя, реализующий интерфейс
PasswordAuthenticatedUserInterface.
Метод возвращает true, если пароль был
захеширован устаревшим алгоритмом или с другими
параметрами, и false в противном случае.
Это позволяет автоматически обновлять хеши
паролей при входе пользователя без смены
самого пароля.
Синтаксис
public function needsRehash(
PasswordAuthenticatedUserInterface $user
): bool
Пример
Давайте создадим сущность пользователя и проверим, нужно ли перехешировать его пароль:
<?php
namespace App\Entity;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
private string $password = '';
public function getUserIdentifier(): string
{
return 'user';
}
public function getRoles(): array
{
return ['ROLE_USER'];
}
public function eraseCredentials(): void
{
}
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
}
?>
Теперь проверим необходимость перехеширования через контроллер:
<?php
namespace App\Controller;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Attribute\Route;
class AuthController extends AbstractController
{
#[Route('/auth/check', name: 'auth_check')]
public function check(UserPasswordHasherInterface $hasher): Response
{
$user = new User();
$user->setPassword($hasher->hashPassword($user, 'abcde'));
$res = $hasher->needsRehash($user);
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
false
Пример
Давайте посмотрим, что вернёт метод, если пароль был захеширован устаревшим алгоритмом:
<?php
namespace App\Controller;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Attribute\Route;
class AuthController extends AbstractController
{
#[Route('/auth/legacy', name: 'auth_legacy')]
public function legacy(UserPasswordHasherInterface $hasher): Response
{
$user = new User();
$user->setPassword(password_hash('abcde', PASSWORD_BCRYPT, ['cost' => 4]));
$res = $hasher->needsRehash($user);
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
true
Пример
Давайте используем метод needsRehash
для автоматического обновления хеша пароля
при успешном входе пользователя:
<?php
namespace App\Controller;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Attribute\Route;
class AuthController extends AbstractController
{
#[Route('/auth/login', name: 'auth_login')]
public function login(
UserPasswordHasherInterface $hasher,
EntityManagerInterface $em
): Response {
$user = new User();
$user->setPassword($hasher->hashPassword($user, 'abcde'));
$plainPassword = 'abcde';
if ($hasher->isPasswordValid($user, $plainPassword)) {
if ($hasher->needsRehash($user)) {
$user->setPassword($hasher->hashPassword($user, $plainPassword));
$em->flush();
}
return new Response('password updated');
}
return new Response('invalid password');
}
}
?>
Результат выполнения кода:
"password updated"
Смотрите также
-
класс
UserPasswordHasher,
который хеширует и проверяет пароли пользователей -
метод
hashPassword,
который хеширует пароль пользователя -
метод
isPasswordValid,
который проверяет соответствие пароля хешу -
интерфейс
PasswordAuthenticatedUserInterface,
который реализуют пользователи с паролем