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

Symfony fosuserbundle如何在没有提供salt的情况下执行登录操作,symfony,fosuserbundle,symfony-2.8,Symfony,Fosuserbundle,Symfony 2.8,在symfony 2.8中,我们使用bcrypt作为密码编码算法。问题是,salt是每次我们进行身份验证时生成的一个随机值。因此,即使我使用相同的密码,每次都会使用不同的salt对其进行编码。还有我的问题:考虑到编码的密码总是不同的,它如何与数据库中存储的密码匹配???也许我错过了什么。这是我执行的一个基本示例,密码从不匹配 use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkE

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

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();

 }
}
这里我们看到,我们使用用户提供的salt进行编码,但由于我们是使用bcrypt算法的Symfony 2.8,所以数据库中没有salt。那么,这里的魔法是如何产生的呢???

如中所述

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

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

根据OP评论更新:

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

$encoderService=$this->container->get('security.password\u encoder')

然后是方法
isPasswordValid

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


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

但是,我正在尝试创建一个Web服务,将给定的纯文本密码与系统存储的密码进行比较。即使密码相同,编码版本也不同。这就是我试图在上面的代码中实现的。我怎样才能做到呢?需要简单,没有额外的供应商。@denny我已经扩展了我的答案以包括你的评论(尽管你真正的需要不是那么清楚地阅读你的问题):-)@denny再次阅读你的帖子和你的评论(我不确定你想达到什么目的),我认为,当您尝试再次比较普通密码编码(而不是与存储的密码进行比较)时,您的疑虑就开始了,这是错误的,因为每次您编码普通密码时,系统都使用不同的随机salt(使用BCrypt)。只能使用答案中所述的方法进行比较。就像符咒一样。秋千
/**
 * {@inheritdoc}
 */
public function encodePassword(UserInterface $user, $plainPassword)
{
    $encoder = $this->encoderFactory->getEncoder($user);

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