Метод hashPassword
Метод hashPassword класса UserPasswordHasher
принимает объект пользователя и пароль в открытом виде,
а возвращает готовый хеш, который можно сохранить в базе данных.
Первым параметром передаётся объект пользователя, реализующий
PasswordAuthenticatedUserInterface, вторым - строка пароля.
Метод сам подбирает соль и алгоритм хеширования из конфигурации
security.yaml, поэтому вручную вызывать password_hash
уже не нужно.
Синтаксис
public function hashPassword(
PasswordAuthenticatedUserInterface $user,
string $plainPassword
): string
Пример
Давайте захешируем пароль 'abcde' для пользователя:
<?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;
class UserController extends AbstractController
{
public function hash(UserPasswordHasherInterface $hasher): Response
{
$user = new User();
$hashed = $hasher->hashPassword($user, 'abcde');
return new Response($hashed);
}
}
?>
Результат выполнения кода:
$2y$13$Q3n7lC0kF2mZ9pXrT4vVwOaBcDeFgHiJkLmNoPqRsTuVwXyZ01234
Пример
Давайте сохраним хеш пароля в сущности пользователя:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
#[ORM\Entity]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private string $username = '';
#[ORM\Column(length: 255)]
private string $password = '';
public function getId(): ?int
{
return $this->id;
}
public function getUsername(): string
{
return $this->username;
}
public function setUsername(string $username): static
{
$this->username = $username;
return $this;
}
public function getPassword(): string
{
return $this->password;
}
public function setPassword(string $password): static
{
$this->password = $password;
return $this;
}
public function getRoles(): array
{
return ['ROLE_USER'];
}
public function eraseCredentials(): void
{
}
public function getUserIdentifier(): string
{
return $this->username;
}
}
?>
Пример
Давайте захешируем пароль и присвоим его пользователю:
<?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;
class UserController extends AbstractController
{
public function register(
UserPasswordHasherInterface $hasher,
EntityManagerInterface $em
): Response {
$user = new User();
$user->setUsername('user');
$hashed = $hasher->hashPassword($user, 'abcde');
$user->setPassword($hashed);
$em->persist($user);
$em->flush();
return new Response('user saved');
}
}
?>
Результат выполнения кода:
"user saved"
Смотрите также
-
класс
UserPasswordHasher,
который хеширует и проверяет пароли пользователей -
метод
isPasswordValid,
который проверяет соответствие пароля хешу -
метод
needsRehash,
который проверяет необходимость перехеширования пароля -
интерфейс
PasswordAuthenticatedUserInterface,
который реализует пользователь с паролем