通过验证更改用户密码( symfony2 )
Posted
技术标签:
【中文标题】通过验证更改用户密码( symfony2 )【英文标题】:changing user's password with verification ( symfony2 ) 【发布时间】:2015-08-21 06:33:28 【问题描述】:我在数据库中有用户,他们的密码使用以下加密:
security:
encoders:
AppBundle\Entity\User:
algorithm: bcrypt
用户注册后,用于编码的密码:
$encoder = $this->container->get('security.password_encoder');
$encoded = $encoder->encodePassword($user, $password);
$user 来自哪里
$form->handleRequest ( $request );
在它的表单被验证之后。在这种情况下,$password 是纯文本。 完成后,我会在我的对象中看到散列字符串:
$2y$13$DF.Es7XjAQKrRklZXRyLX.YYzRG7gC3XOLA72eul6BEVigMbvir4C
在我的控制器中,当我尝试修改用户密码时,我添加了一个新字段,如下所示:
$form->add ( 'oldpassword', 'password', array('label'=>'old password', 'required'=>true, 'error_bubbling'=>true, 'mapped' => false) );
所以我可以达到它的价值
$form->get('oldpassword')->getData()
我的目标是在将对象刷新到数据库之前检查“旧密码”字段与保存的字段 ($user->getPassword())。
现在看起来是这样的:
$form->handleRequest ( $request );
if ($form->isSubmitted ())
if ( !$functions->passwordVerify($user, $form->get('oldpassword')->getData()) )
$form->get ( 'oldpassword' ) ->addError ( new FormError ( "Your current password is invalid" ) );
其中 $functions 是注入服务的函数:
public function passwordVerify($user=null, $oldpassword=null)
$encoder = $this->container->get('security.password_encoder');
$valid = $encoder->isPasswordValid($user, $oldpassword);
return $valid;
不知何故,$valid 变量总是返回 false。 我为“oldpassword”写的密码和我注册时使用的完全一样(编码器见上面的代码)。
看起来永远不会生成相同的哈希/令牌...
提前谢谢你。
【问题讨论】:
确保你没有换盐.. 不确定 symfony,但对我来说,您似乎传递了错误的参数,密码编码器几乎不会从用户那里获取密码。不应该是$encoder->encodePassword($password);
和$encoder->isPasswordValid($password, $oldpassword);
吗?查看文档。
【参考方案1】:
您应该尝试使用内置的 UserPassword 验证器约束,它专为这项任务而设计。
【讨论】:
以上是关于通过验证更改用户密码( symfony2 )的主要内容,如果未能解决你的问题,请参考以下文章