Symfony2:登录检查前对密码进行编码
我遵循了symfony主页上的指南 新创建的用户将使用加密密码存储到数据库中(加密发生在控制器中)。但是,当我尝试使用数据库中的用户登录时,由于比较来自登录表单的原始密码和来自数据库的加密密码,身份验证失败 所以我的问题是如何在登录检查之前加密登录表单中的密码?扩展例如DaoAuthenticationProvider是一个合适的解决方案吗?还是我的方法完全错误,因为我将加密与模型分开 security.yml:Symfony2:登录检查前对密码进行编码,symfony,login,hash,Symfony,Login,Hash,我遵循了symfony主页上的指南 新创建的用户将使用加密密码存储到数据库中(加密发生在控制器中)。但是,当我尝试使用数据库中的用户登录时,由于比较来自登录表单的原始密码和来自数据库的加密密码,身份验证失败 所以我的问题是如何在登录检查之前加密登录表单中的密码?扩展例如DaoAuthenticationProvider是一个合适的解决方案吗?还是我的方法完全错误,因为我将加密与模型分开 security.yml: security: encoders: MyCorp\User
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(),
);
}
用户控制器(创建时加密的示例):
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(),
);
}
你认为为什么会使用原始密码?原始密码确实是通过网络发送的,但为了验证密码,Symfony使用了与您编码密码相同的编码器 它使用PasswordEncoderInterface-的另一个方法,该方法接受未编码的原始密码
你的应用程序肯定有其他问题。顺便说一句,您的salt生成了吗?n确认,谢谢您的PasswordEncoderface提示。我调试了使用过的身份验证提供程序,注意到数据库字段的大小对于生成的哈希来说不够长。这就是比较失败的原因。