当我尝试在服务中使用编码器时出现以下错误:
Cannot instantiate interface Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface
。
这是我的代码:
namespace App\Service;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class Test
{
public function encodePassword($username, $password)
{
$passwordEncoder = new UserPasswordEncoderInterface();
$encodedPassword = $passwordEncoder->encodePassword($admin, $password);
return $encodedPassword;
}
}
我正在使用symfony 4。
答案 0 :(得分:0)
要在Symfony中对密码进行编码,请使用编码器工厂。您可以通过在构造函数中注入EncoderFactoryInterface
的实例来将其注入自己的服务中(如果启用了自动装配,Symfony将自动对其进行处理),然后按以下方式使用它:
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class SomeService
{
/**
* @var EncoderFactoryInterface
*/
private $securityEncoderFactory;
public function __construct(EncoderFactoryInterface $securityEncoderFactory)
{
$this->securityEncoderFactory = $securityEncoderFactory;
}
public function encodePassword(UserInterface $user, $password)
{
$encoder = $this->securityEncoderFactory->getEncoder($user);
return $encoder->encodePassword($password, $user->getSalt());
}
}
请注意,我们希望User实体带有盐。如果尚未生成盐,则应在对密码进行编码之前完成。
使用盐和密码更新用户的简单方法如下所示:
public function setPassword(UserInterface $user, string $password)
{
$user->setSalt(base64_encode(random_bytes(18)));
$this->setPassword($user, $this->encodePassword($password));
}
别忘了以后再保留实体。