Sonata、Symfony、密码加密、原则侦听器/订户

Sonata、Symfony、密码加密、原则侦听器/订户,symfony,doctrine-orm,doctrine,password-encryption,sonata,Symfony,Doctrine Orm,Doctrine,Password Encryption,Sonata,信息服务:我不熟悉Symfony和Sonata 我的目标:仅为数据库端加密密码。我可以清楚地显示这个密码。所有这些都适用于实体服务中的密码字段 我在试什么我试图创建一个使用bcrypt加密的条令侦听器 安全: 编码器: 应用程序\实体\服务:bcrypt 这是我的App\doctor中的HashPasswordLisetener.php(在App\Admin\ServiceAdmin.php中我的configureFormField函数的$formMapper中,我有一行类似于这样

信息服务:我不熟悉Symfony和Sonata

  • 我的目标:仅为数据库端加密密码。我可以清楚地显示这个密码。所有这些都适用于实体服务中的密码字段

    • 我在试什么我试图创建一个使用
      bcrypt
      加密的条令侦听器

      安全:

      编码器: 应用程序\实体\服务:bcrypt


  • 这是我的App\doctor中的HashPasswordLisetener.php(在App\Admin\ServiceAdmin.php中我的configureFormField函数的$formMapper中,我有一行类似于这样的
    ->add('password')


    • 它给我的结果是:

    • 我的问题是: 我知道函数encodePassword正在第一个arg(而不是我的实体)中等待用户接口,密码在第二个arg中等待加密,但我不知道谁在使用此用户接口?我该怎么称呼它呢?要得到它吗?发送它

    我想我给出了很多细节,但如果我忘了什么,请随时通知我^^
    感谢您至少花时间阅读。

    我遇到了一个问题,但我正在编写一种哈希类型的代码,但我正在寻找一种加密方法。但我是这样处理工作哈希的:

    • 步骤1:在我的服务实体中实现UserInterface

    • 步骤2:在侦听器中为UserPasswordEncoderInterface替换UserPasswordEncoder

    • 步骤2.5:添加了
      用户界面
      所需的所有函数,如
      擦除凭据
      getSalt()
      。。请参阅:以了解更多详细信息

    • 步骤3:添加一个
      getUsername
      ,其中
      返回此->标识符

    • 步骤4:在表单字段中使用
      普通密码
      ,而不是
      密码

    • 步骤5:添加一个提供程序:

      应用程序用户:

        entity:
        class: 'App\Entity\Service'
        property: 'identifier'
      
    • 步骤6:使用
      TextType::class
      作为
      plainPassword
      表单字段类型+修复
      使用
      : Symfony\Component\Form\Extension\Core\Type\TextType

    • 步骤7:工作


    (特别感谢@msg,他帮了我很多忙)

    UserInterface
    在全世界都有使用。只需让您的
    服务
    实体实现它。但是如果您不想,您可以使用
    PasswordEncoder
    而不是
    UserPasswordEncoder
    ,请参见
    EncoderFactory
    。好的,我将尝试tytype提示它为
    UserPasswordEncoderInterface
    ,就像您以前使用的那样。这不一定是
    用户名
    字段,只是唯一标识用户帐户的一种方法。我猜在您的情况下,只需删除
    abstract
    关键字并使其
    return$this->identifier。您确定正在调用侦听器吗?另一方面,
    setPassword
    只应由侦听器调用,不应该以明文密码结束,表单映射正确吗?
    <?php
    
    namespace App\Entity;
    
    use App\Admin\AbstractAdmin;
    use App\Repository\ServiceRepository;
    use Doctrine\ORM\Mapping as ORM;
    use Gedmo\Timestampable\Traits\TimestampableEntity;
    use Symfony\Component\Security\Core\User\UserInterface;
    
    /**
     * @ORM\Entity(repositoryClass=ServiceRepository::class)
     */
    class Service implements UserInterface
    {
    
        use TimestampableEntity;
    
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $name;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $password;
    
        /**
         * @ORM\Column(type="text", nullable=true, length=255)
         */
        private $comment;
    
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $identifier;
    
        private $plainPassword;
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        public function getName(): ?string
        {
            return $this->name;
        }
    
        public function setName(string $name): self
        {
            $this->name = $name;
    
            return $this;
        }
    
        public function getPassword(): ?string
        {
            return $this->password;
        }
    
        public function setPassword(string $password): self
        {
            $this->password = $password;
    
            return $this;
        }
    
        public function getComment(): ?string
        {
            return $this->comment;
        }
    
        public function setComment(?string $comment): self
        {
            $this->comment = $comment;
    
            return $this;
        }
    
        public function getIdentifier(): ?string
        {
            return $this->identifier;
        }
    
        public function setIdentifier(string $identifier): self
        {
            $this->identifier = $identifier;
    
            return $this;
        }
    
        /**
         * @return mixed
         */
        public function getPlainPassword()
        {
            return $this->plainPassword;
        }
    
        /**
         * @param mixed $plainPassword
         */
        public function setPlainPassword($plainPassword): void
        {
            $this->plainPassword = $plainPassword;
            $this->password = null;
        }
    
        public function getRoles()
        {
            return array('ROLE_USER');
        }
    
        public function getSalt()
        {
        }
    
        public function eraseCredentials()
        {
            $this->plainPassword = null;
        }
    
        public function getUsername()
        {
            return $this->identifier;
        }
    }
    
    app.doctrine.hash_password_listener:
        class: App\Doctrine\HashPasswordListener
        autowire : true
        tags:
            - { name: doctrine.event_subscriber, connection: 'default' }
    
      entity:
      class: 'App\Entity\Service'
      property: 'identifier'