Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 问题编辑用户时,如何存储正确编码的密码?_Symfony - Fatal编程技术网

Symfony 问题编辑用户时,如何存储正确编码的密码?

Symfony 问题编辑用户时,如何存储正确编码的密码?,symfony,Symfony,我没有使用FOSUserBundle,我自己创建了实体用户、角色等。配置如下所示: security: encoders: Bundle\UserBundle\Entity\User: algorithm: sha512 encode-as-base64: true iterations: 10 在创建时,我会这样做: if ($form->isValid()) {

我没有使用FOSUserBundle,我自己创建了实体用户、角色等。配置如下所示:

security:
    encoders:
          Bundle\UserBundle\Entity\User: 
            algorithm: sha512
            encode-as-base64: true
            iterations: 10
在创建时,我会这样做:

if ($form->isValid()) {
            $factory = $this->get('security.encoder_factory');
            $encoder = $factory->getEncoder($entity);
            $entity->setSalt(md5(time()));
            $entity->setCompany($company);
            $encoded_password = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
            $entity->setPassword($encoded_password);
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('user'));
        }
但是,编辑任何用户时,密码显示为:

2cp/D6OTBEx4m2Y9xM/ku6rOtgODhrXK7//3Pd8D0jnZkOuusPB120Jwb6x+kan/52qSQuQxcUYDP1T6q6zqbw== 
但是,如果我保存任何其他更改,密码会被覆盖,我无法再访问,同样,如果我输入一个新密码,它不会被编码(显然,因为我没有在updateAction上执行任何操作),但我想知道实现这一点的正确方法是什么

使用预更新?在“编辑”中分隔密码字段,以便该字段不会被覆盖

尝试使用设置密码。如果在用户编辑表单中遗漏了它们,则原则不会在DB中更新它们,也不会被覆盖

  • 也不要使用
    notBlank
    密码验证程序

    $oldPass = $entity->getPassword();
    // Handle form from request
    if ($form->isValid()) {
        if ($entity->getPassword() == '' || $entity->getPassword() == NULL) {
            $entity->setPassword($oldPass);
        } else {
            $factory = $this->get('security.encoder_factory');
            $encoder = $factory->getEncoder($entity);
            $entity->setSalt(md5(time()));
            $entity->setCompany($company);
            $encoded_password = $encoder->encodePassword($entity->getPassword(), $entity->getSalt());
            $entity->setPassword($encoded_password);
        }
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();
    
        return $this->redirect($this->generateUrl('user'));
    }
    

您好,尽管编辑时不显示密码,但如果我编辑任何其他字段,将存储一个空白密码。还可以使用预更新进行密码编码。你使用的是什么版本的Symfony?我只是做了一些类似的事情,但是我无法获得旧密码,然后意识到我在处理请求后获得了密码,导致密码已经是空的。我使用的是2.3.x版本,我会对密码使用另一个属性(FOSUserBundle使用
plainPassword
),然后在prePersist/preUpdate侦听器中,如果plainPassword不为null,则编码并更新实际密码字段。