BonBonSlick
@BonBonSlick
Vanilla Web Architect

Какой смысл в PasswordEncoderInterface когда есть и используется везде UserPasswordEncoderInterface?

https://github.com/symfony/symfony/blob/5.x/src/Sy...

UserPasswordEncoderInterface
Я не понимаю для чего первый сервис. Всегда и везде использовал второй.
Поковырял конечно исходники, но так и не понял для чего.
Для тех кто не знает
if ($encoder->isPasswordValid($user->toPassword()->password(), $typedPassword, $user->getSalt())) {
            return;
                }
        }


Против
if (false === $this->passwordEncoder->isPasswordValid($user, $request->get('password'))) {
            return;
        }
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
UserPasswordEncoderInterface - всего лишь сахар при использовании в простых кейсах.
К примеру у вас есть сущность
class User implements UserInterface
{
    public function __construct(string $username, string $password)
    {
        $this->username = $username;
        $this->password = $password;
    }
}

В данном случае $password - это не plainPassword, а уже захешированный.
Как создать такую сущность, если UserPasswordEncoderInterface требует инстанс этого класса?

$user = new User($username, $this->encodePassword($plainPassword));

private EncoderFactoryInterface $encoderFactory;
private function encodePassword(string $plainPassword): string
{
    $encoder = $this->encoderFactory->getEncoder(User::class);

    return $encoder->encodePassword($plainPassword, null);
}


Eсли уж быть точнее, то ответ на вопрос "Какой смысл в PasswordEncoderInterface если есть UserPasswordEncoderInterface?" - нельзя, не нарушая SRP, реализовать UserPasswordEncoderInterface, не имея при этом PasswordEncoderInterface и EncoderFactoryInterface, т.е. это интерфейс более высокого уровня, чем PasswordEncoderInterface

P.S. Соль хранить не надо. В данном случае это рудимент, который остался от первых версий, когда не использовался password_hash, который добавляет метаданные рядом с хешем. Достаточно создать метод-заглушку:
public function getSalt()
{
    return null;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы