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?

Author: Scott Arciszewski, 2015-12-31

2 answers

Обновление до Symfony3.

BCryptPasswordEncoder.php строка 75:

if ($salt) {
    // Ignore $salt, the auto-generated one is always the best
}
 2
Author: malcolm, 2016-03-21 20:27:41

Вы можете установить атрибут $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
}
 1
Author: Nguyen Huu Huy, 2016-06-08 05:45:11