FOSUserBundle BCryptPasswordEncoder 加盐
FOSUserBundle BCryptPasswordEncoder salting
升级到 php7 后,BCryptPasswordEncoder 抛出以下错误,例如在使用 FOSUserBundle 标准注册页面注册时:
"Use of the 'salt' option to password_hash is deprecated in C:\xampp\htdocs\ascentary
\vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php line 81
" at C:\xampp\htdocs\testproject\vendor\behat\behat\src\Behat\Testwork\Call\Handler\RuntimeCallHandler."
我已经找到这个问题,问题是 FOS UserManager class,它调用:
/**
* {@inheritDoc}
*/
public function updatePassword(UserInterface $user)
{
if (0 !== strlen($password = $user->getPlainPassword())) {
$encoder = $this->getEncoder($user);
$user->setPassword($encoder->encodePassword($password, $user->getSalt()));
$user->eraseCredentials();
}
}
在此处传递 $user->getSalt() 会引发错误,因为在 php7,您不再被允许将自定义盐传递给 bcrypt 编码/password_hash 函数。此外,我在基本 fos 用户实体中看到一个问题,因为在其构造函数中,salt 设置如下:
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
问题:
(1) 如何解决我在上面发布的错误?也许重写UserManager,或者有fos提供的解决方案吗?
(2) 如何正确保护自动生成的盐?
(3) 是否需要任何其他更新,例如更新 ircmaxell 库?
升级到 Symfony 3。
BCryptPasswordEncoder.php
第 75 行:
if ($salt) {
// Ignore $salt, the auto-generated one is always the best
}
您可以通过覆盖 FOS\UserBundle\Model\User
将 $salt 属性设置为空
namespace YourNamespace\UserBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="YourNamespace\UserBundle\Repository\UserRepository")
* @ORM\Table(name="`user`")
* @ORM\AttributeOverrides({
@ORM\AttributeOverride(
* name="salt",
* column=@ORM\Column(name="salt", type="string", nullable=true)
* )
* })
*
*/
class User extends BaseUser
{
/**
* User constructor.
*/
public function __construct()
{
parent::__construct();
$this->salt = null;
}
//another codes
}
升级到 php7 后,BCryptPasswordEncoder 抛出以下错误,例如在使用 FOSUserBundle 标准注册页面注册时:
"Use of the 'salt' option to password_hash is deprecated in C:\xampp\htdocs\ascentary \vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php line 81 " at C:\xampp\htdocs\testproject\vendor\behat\behat\src\Behat\Testwork\Call\Handler\RuntimeCallHandler."
我已经找到这个问题,问题是 FOS UserManager class,它调用:
/**
* {@inheritDoc}
*/
public function updatePassword(UserInterface $user)
{
if (0 !== strlen($password = $user->getPlainPassword())) {
$encoder = $this->getEncoder($user);
$user->setPassword($encoder->encodePassword($password, $user->getSalt()));
$user->eraseCredentials();
}
}
在此处传递 $user->getSalt() 会引发错误,因为在 php7,您不再被允许将自定义盐传递给 bcrypt 编码/password_hash 函数。此外,我在基本 fos 用户实体中看到一个问题,因为在其构造函数中,salt 设置如下:
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
问题:
(1) 如何解决我在上面发布的错误?也许重写UserManager,或者有fos提供的解决方案吗?
(2) 如何正确保护自动生成的盐?
(3) 是否需要任何其他更新,例如更新 ircmaxell 库?
升级到 Symfony 3。
BCryptPasswordEncoder.php
第 75 行:
if ($salt) {
// Ignore $salt, the auto-generated one is always the best
}
您可以通过覆盖 FOS\UserBundle\Model\User
将 $salt 属性设置为空namespace YourNamespace\UserBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="YourNamespace\UserBundle\Repository\UserRepository")
* @ORM\Table(name="`user`")
* @ORM\AttributeOverrides({
@ORM\AttributeOverride(
* name="salt",
* column=@ORM\Column(name="salt", type="string", nullable=true)
* )
* })
*
*/
class User extends BaseUser
{
/**
* User constructor.
*/
public function __construct()
{
parent::__construct();
$this->salt = null;
}
//another codes
}