Класс 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,
который проверяет необходимость перехеширования