FOSUserBundle BCryptPasswordEncoder посолка
После обновления до php7 BCryptPasswordEncoder выдает следующую ошибку, например, при регистрации при использовании стандартной страницы регистрации FOSUserBundle:
"Использование опции "соль" для password_hash устарело в C:\xampp\htdocs\ascentary \vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php строка 81 "в C:\xampp\htdocs\testproject\vendor\behat\behat\src\Behat\Testwork\Call\Handler\RuntimeCallHandler."
Я отследил эту проблему, и проблема заключается в классе FOS UserManager, который вызывает:
/**
* {@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, потому что в ее конструкторе установлена соль например:
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
Вопросы:
(1) Как устранить ошибку, которую я опубликовал выше? Может быть, переопределение UserManager, или есть решение, предоставляемое fos?
(2) Как правильно защитить соль, которая автоматически генерируется?
(3) Требуются ли какие-либо другие обновления, например обновление библиотеки ircmaxell?
2 answers
Обновление до Symfony3.
BCryptPasswordEncoder.php
строка 75:
if ($salt) {
// Ignore $salt, the auto-generated one is always the best
}
Вы можете установить атрибут $salt равным нулю, переопределив FOS\UserBundle\Модель\Пользователь
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
}