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

Класс UserPasswordHasher

Класс UserPasswordHasher предназначен для безопасной работы с паролями пользователей. Он позволяет хешировать пароль перед сохранением в базу данных и проверять, соответствует ли введённый пароль сохранённому хешу. Класс реализует интерфейс UserPasswordHasherInterface, который автоматически доступен через внедрение зависимостей.

Основные методы: hashPassword, isPasswordValid и needsRehash. Метод hashPassword принимает объект пользователя и пароль в открытом виде, возвращая хешированную строку. Метод isPasswordValid сравнивает открытый пароль с хешем. Метод needsRehash проверяет, нужно ли перехешировать пароль из-за изменения алгоритма.

Синтаксис

use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; // Внедрение через конструктор public function __construct( private UserPasswordHasherInterface $passwordHasher ) {} // Хеширование пароля $hashedPassword = $this->passwordHasher->hashPassword($user, $plainPassword); // Проверка пароля $isValid = $this->passwordHasher->isPasswordValid($user, $plainPassword); // Проверка необходимости перехеширования $needsRehash = $this->passwordHasher->needsRehash($user);

Пример

Давайте создадим сервис для регистрации пользователя, который хеширует пароль перед сохранением:

<?php namespace App\Service; use App\Entity\User; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; class UserService { public function __construct( private UserPasswordHasherInterface $passwordHasher, private EntityManagerInterface $entityManager ) {} public function register(string $email, string $plainPassword): User { $user = new User(); $user->setEmail($email); $hashedPassword = $this->passwordHasher->hashPassword($user, $plainPassword); $user->setPassword($hashedPassword); $this->entityManager->persist($user); $this->entityManager->flush(); return $user; } } ?>

Результат выполнения кода:

"Пользователь успешно зарегистрирован с хешированным паролем"

Пример

Давайте проверим, соответствует ли введённый пароль сохранённому хешу:

<?php namespace App\Controller; use App\Repository\UserRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; use Symfony\Component\Routing\Attribute\Route; class SecurityController extends AbstractController { #[Route('/login', name: 'app_login')] public function login( UserRepository $userRepository, UserPasswordHasherInterface $passwordHasher ): Response { $user = $userRepository->findOneBy(['email' => 'user@example.com']); if (!$user) { return new Response('Пользователь не найден'); } $plainPassword = 'abcde'; $isValid = $passwordHasher->isPasswordValid($user, $plainPassword); return new Response($isValid ? 'Пароль верный' : 'Пароль неверный'); } } ?>

Результат выполнения кода:

Пароль верный

Пример

Давайте проверим, нужно ли перехешировать пароль пользователя при изменении алгоритма:

<?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 UserController extends AbstractController { #[Route('/user/rehash', name: 'user_rehash')] public function rehash(UserPasswordHasherInterface $passwordHasher): Response { $user = new User(); $user->setPassword('$2y$13$abcdefghijklmnopqrstuv'); $needsRehash = $passwordHasher->needsRehash($user); return new Response($needsRehash ? 'Требуется перехеширование' : 'Перехеширование не требуется'); } } ?>

Результат выполнения кода:

Требуется перехеширование

Смотрите также

  • интерфейс PasswordAuthenticatedUserInterface,
    который должны реализовывать пользователи для работы с паролями
  • метод hashPassword,
    который хеширует пароль пользователя
  • метод isPasswordValid,
    который проверяет соответствие пароля хешу
  • метод needsRehash,
    который проверяет необходимость перехеширования
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить