在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,因此数据库中没有盐。那么,这里的魔力怎么发生????
答案 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。