如何在Symfony 3中比较密码(Bcrypt哈希值)?

5
在为网站设置“更改密码”功能时,我有一个次要的密码输入(需要再次输入密码才能更改密码)。
我需要检查用户当前的密码(使用Bcrypt哈希)是否与已输入的密码相符。
在我的控制器操作中:
$currentPassword = $request->request->get('password');
$encoder = $this->container->get('security.password_encoder');
$encodedPassword = $encoder->encodePassword($user, $currentPassword);

if($encodedPassword == $user->getPassword()) { // these don't ever match.
    // ...
}
encodePassword(...)函数生成输入密码的摘要,但它与保存的密码(明文相同)不同,因此我认为应用了不同的盐,从而导致不匹配。
由于Bcrypt将盐合并到密码摘要中,因此我没有在任何地方保存它。
如何在Symfony 3中检查输入的明文密码是否与存储的Bcrypt摘要匹配?
我没有使用FOSUserBundle
1个回答

14
您可以使用编码服务的isPasswordValid方法将$currentPassword密码与存储的密码进行比较:

$encoderService = $this->container->get('security.password_encoder')

然后将用户对象作为第一个参数传递给该方法:

$match = $encoderService->isPasswordValid($userObject, $currentPassword)

如果比较匹配,则返回true,否则返回false

太棒了。非常感谢。我在文档中不知道怎么错过了这个。 - ChristianF
1
很高兴能帮助@Chris。顺便说一下:有时只需检查类方法(使用IDE的快捷方式),即可找到未来有用的东西 :-) - gp_sflover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接