Symfony2代码组织:在持久化到db之前加密密码的逻辑应该去哪里?

时间:2011-08-05 16:09:14

标签: forms symfony code-organization

如果您使用数据库存储用户,则可以保存用户信息,如下所示: (来自the Symfony security book。)

$factory = $this->get('security.encoder_factory');
$user = new Acme\UserBundle\Entity\User();

$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword('mypassword', $user->getSalt());
$user->setPassword($password);

但是,我想创建一个可重用的用户表单:

namespace App\Bundle\WebBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class UserType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('username')
            ->add('password')
        ;
    }

    public function getName()
    {
        return 'app_bundle_webbundle_usertype';
    }
}

并在控制器中使用该表单: (来自here

if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getEntityManager();
        $em->persist($task);
        $em->flush();

        return $this->redirect($this->generateUrl('task_success'));
    }
}

为了使其可重用并与$ form-> bindRequest兼容,您应该将用于散列密码的代码放在本文开头显示(以及生成盐的代码) ()方法,如果您需要用户注册表单和用户配置文件编辑表单等?

3 个答案:

答案 0 :(得分:2)

我建议您查看:https://github.com/FriendsOfSymfony/FOSUserBundle。即使您想编写自己的解决方案,也可以从该捆绑包中获得非常好的想法。

答案 1 :(得分:0)

密码加密最好放在Doctrine的@PrePersist回调方法中。

答案 2 :(得分:0)

在模型中?

在设置器中,您可以添加加密。