通过验证更改用户密码( 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 )的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 自定义身份验证:用户登录但未通过身份验证

vue项目怎么设置卡密验证

linux免密登录secure报密码过期

Symfony2 通过第 3 方 REST API 进行身份验证

将旧用户迁移到 symfony2

linux添加用户 完全删除用户