在symfony中没有用户实例的哈希用户密码
Hash user password without User instance in symfony
正如在 official documentation 中所读,当前在 Symfony 框架中手动散列密码的过程如下:
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
public function register(UserPasswordEncoderInterface $encoder)
{
// whatever *your* User object is
$user = new App\Entity\User();
$plainPassword = 'ryanpass';
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
}
encodePassword
方法要求将 User 实例作为其第一个参数传递。因此,调用该方法时,User 实例必须预先存在:这意味着 'User' 必须在没有有效哈希密码的情况下实例化。我希望将密码作为构造函数参数提供,以便用户实体在创建时处于有效状态。
是否有使用 Symfony 散列密码的替代方法?
UserPasswordEncoder 使用所谓的 EncoderFactory 来确定给定类型用户的确切密码编码器。将您的代码调整为:
public function register(EncoderFactoryInterface $encoderFactory)
{
$passwordEncoder = $encoderFactory->getEncoder(User::class);
$hashedPassword = $passwordEncoder->encodePassword($plainPassword,null);
这应该可以正常工作。请注意,getEncoder 可以采用 class 实例或 class 名称。
另请注意,需要为盐显式发送 null。由于某些原因,某些 Symfony 编码器 classes 还没有盐的默认值。
正如在 official documentation 中所读,当前在 Symfony 框架中手动散列密码的过程如下:
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
public function register(UserPasswordEncoderInterface $encoder)
{
// whatever *your* User object is
$user = new App\Entity\User();
$plainPassword = 'ryanpass';
$encoded = $encoder->encodePassword($user, $plainPassword);
$user->setPassword($encoded);
}
encodePassword
方法要求将 User 实例作为其第一个参数传递。因此,调用该方法时,User 实例必须预先存在:这意味着 'User' 必须在没有有效哈希密码的情况下实例化。我希望将密码作为构造函数参数提供,以便用户实体在创建时处于有效状态。
是否有使用 Symfony 散列密码的替代方法?
UserPasswordEncoder 使用所谓的 EncoderFactory 来确定给定类型用户的确切密码编码器。将您的代码调整为:
public function register(EncoderFactoryInterface $encoderFactory)
{
$passwordEncoder = $encoderFactory->getEncoder(User::class);
$hashedPassword = $passwordEncoder->encodePassword($plainPassword,null);
这应该可以正常工作。请注意,getEncoder 可以采用 class 实例或 class 名称。
另请注意,需要为盐显式发送 null。由于某些原因,某些 Symfony 编码器 classes 还没有盐的默认值。