gpt4 book ai didi

symfony - 如何在模型 setter 中使用 Symfony 2 中的编码器工厂?

转载 作者:行者123 更新时间:2023-12-03 15:22:51 24 4
gpt4 key购买 nike

这个关于 Symfony 2.1 的问题

如何对用户密码进行编码:

$factory = $this->get('security.encoder_factory');
$user = new Acme\UserBundle\Entity\User();

$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword('ryanpass', $user->getSalt());
$user->setPassword($password);

和基本配置:
# app/config/security.yml
security:
# ...

encoders:
Acme\UserBundle\Entity\User: sha512

在 setter 模型内部:
class User implements UserInterface, \Serializable
{
public function setPassword($password)
{
$this->password = $password;
}
}

我认为加密密码的过程必须按模型处理。
如何在模型中使用标准编码器工厂?

最佳答案

虽然我同意@Vadim 的观点,即您不应该将业务逻辑泄漏到您的模型中,但我会小心地将明文密码的散列推迟到 prePersist。例如,除非您调用 persistflushsetPassword 之后.一个 getPassword同时调用将返回明文字符串,除非您将其存储在单独的字段中,这可能会产生严重后果。理想情况下,明文密码应在应用程序的生命周期内尽可能短地存在。

我建议使用服务层,其中“用户管理器”为常见任务提供接口(interface),这样您即使暂时不需要污染密码属性:

class UserManager
{
// ...
public function __construct(EncoderFactoryInterface $encoderFactory)
{
// $encoderFactory is injected by the DIC as requested by your service configuration
// ...
}

public function setUserPassword(UserInterface $user, $plaintextPassword)
{
$hash = $this->encoderFactory->getEncoder($user)->encodePassword($plaintextPassword, null);
$user->setPassword($hash);
}
// ...
}

在您的注册表单提交 Controller 中,例如:
public function userRegistrationAction()
{
// ...
if ($form->isValid()) {
$user = new User();
// ...
$this->get('my.bundle.user_manager')->setUserPassword($user, $form->get('password')->getData());
// ...
}
}

关于symfony - 如何在模型 setter 中使用 Symfony 2 中的编码器工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com