fosuserbundle如何在没有提供salt的情况下执行登录操作

时间:2017-03-10 16:06:30

标签: symfony fosuserbundle symfony-2.8

在symfony 2.8中,我们使用bcrypt作为密码编码算法。问题是盐是每次我们进行身份验证时生成的随机值。因此,即使我使用相同的密码,每次都会使用不同的盐对其进行编码。还有我的问题是:鉴于编码密码总是不同,它如何与数据库中存储的密码相匹配?或许我错过了一些东西。这是我执行的基本示例,密码永远不匹配。

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use Symfony\Component\HttpFoundation\Request;
  use Primicia\SeguridadBundle\Entity\Usuario as Usuario;

class ServicesController extends Controller
{
    public function loginServiceAction($user,$pass,Request $request){
        $response = new Response();
        $userManager = $this->container->get('fos_user.user_manager');
        $userFos = $userManager->findUserBy(array('username' => $user));
        if($userFos== null)
        {
           $response->setContent(json_encode(array('isUser' => false)));
           return $response;
        }
        $encoder = $this->container->get('security.password_encoder');
        $encoded = $encoder->encodePassword($userFos,$pass);
        echo 'salt'.$userFos->getPlainPassword().'</br>';
        echo ('enc  '.$encoded);
        echo '</br> user'.$userFos->getPassword();

 }
}

如果我们检查$ encoder-&gt; encodePassword()方法,我们会发现:

/**
 * {@inheritdoc}
 */
public function encodePassword(UserInterface $user, $plainPassword)
{
    $encoder = $this->encoderFactory->getEncoder($user);

    return $encoder->encodePassword($plainPassword, $user->getSalt());
}

在这里,我们看到我们使用提供的用户的salt进行编码,但由于我们是使用bcrypt algorythm的Symfony 2.8,因此数据库中没有盐。那么,这里的魔力怎么发生????

1 个答案:

答案 0 :(得分:2)

Using the BCrypt Password Encoder

中所述
  

自动生成每个新密码的salt,无需保留。由于编码密码包含用于编码的盐,因此仅保留编码密码就足够了。

实际上,如果您使用BCrypt对密码进行编码,则getSalt()实体中UserInterface实现所需的User方法可以返回null

根据OP评论进行更新:

您可以使用服务将普通密码与存储密码进行比较:

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

然后是方法isPasswordValid

$match = $encoderService->isPasswordValid($userFosObject, $plainPasswordString)

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