在服务中使用编码器

时间:2018-08-10 14:24:14

标签: php symfony

当我尝试在服务中使用编码器时出现以下错误:

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。

1 个答案:

答案 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));
}

别忘了以后再保留实体。