0

我已经按照symfony 主页上的指南(编码用户密码如何自定义表单登录)进行操作。

新创建的用户将使用加密密码存储到数据库中(加密发生在控制器中)。但是,当我尝试使用数据库中的用户登录时,由于比较来自登录表单的原始密码和来自数据库的加密密码,身份验证失败。

所以我的问题是如何在 login_check 之前加密来自登录表单的密码?扩展例如DaoAuthenticationProvider是否是一个合适的解决方案?或者我的方法完全错误,因为我将加密与模型分开?

安全性.yml:

security:
   encoders:
       MyCorp\UserBundle\Entity\User:
           algorithm:          sha512
           encode_as_base64:   true
           iterations:         1000
providers:
       db_users:
           entity: {class: MyCorpUserBundle:User, property: username}

用户控制器(创建时加密的示例):

/**
  * Creates a new User entity.
  *
  * @Route("/", name="user_create")
  * @Method("POST")
  * @Template("MyCorpUserBundle:User:new.html.twig")
  */
 public function createAction(Request $request)
 {
     $entity = new User();
     $factory = $this->get('security.encoder_factory');
     $encoder = $factory->getEncoder($entity);
     $form = $this->createCreateForm($entity);
     $form->handleRequest($request);

     if ($form->isValid()) {
         $pasword = $encoder->encodePassword($entity->getPassword(), $user->getSalt());
         $entity->setPassword($pasword);

         $em = $this->getDoctrine()->getManager();
         $em->persist($entity);
         $em->flush();

         return $this->redirect($this->generateUrl('user_show', array('id' => $entity->getId())));
     }

     return array(
         'entity' => $entity,
         'form'   => $form->createView(),
     );
 }
4

1 回答 1

1

您为什么认为使用原始密码?原始密码确实是通过网络发送的,但是为了验证密码,Symfony 使用了您用来对其进行编码的相同编码器。

它使用 PasswordEncoderInterface 的另一种方法 - isPasswordValid(),它接受未编码的原始密码。

您的应用程序肯定有其他问题。顺便说一句,你的盐生成了吗?

于 2013-09-06T13:34:27.183 回答