РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
584 of 1361 menu

Метод 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,
    который реализуют пользователи с паролем
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить