2015-12-31 35 views
5

Po aktualizacji do php7, BCryptPasswordEncoder zgłasza następujący błąd, np. w sprawie rejestracji przy użyciu FOSUserBundle standardową stronę rejestracji:FOSUserBundle BCryptPasswordEncoder solenie

„Zastosowanie 'sól' opcją password_hash jest nieaktualna w katalogu C: \ xampp \ htdocs \ ascentary \ vendor \ symfony \ symfony \ src \ Symfony \ Komponent \ security \ Rdzeń \ Encoder \ BCryptPasswordEncoder.php linia 81 "C:. \ xampp \ htdocs \ testproject \ vendor \ behat \ behat \ src \ behat \ Testwork \ połączeń \ Handler \ RuntimeCallHandler"

I ve wyśledził ten problem, a problem dotyczy klasy FOS UserManager, która wywołuje:

/** 
* {@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(); 
    } 
} 

Podanie tutaj $ user-> getSalt() zgłasza błąd, ponieważ w php7 nie możesz już przekazywać niestandardowej soli do funkcji bcrypt encoding/password_hash. Ponadto widzę problemu w bazie fos podmiot użytkownika, ponieważ w jej konstruktora, sól jest ustawiony jak:

$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36); 

Pytania:

(1) Jak rozwiązać błąd napisałem powyżej? Może przesłonić UserManager, czy może istnieje rozwiązanie dostarczone przez Fosha?

(2) Jak właściwie zabezpieczyć sól, która jest automatycznie generowana?

(3) Czy są jakieś inne aktualizacje wymagane, takie jak aktualizacja biblioteki ircmaxell?

+0

[bcrypt nie jest algorytmem szyfrowania] (https : //paragonie.com/blog/2015/08/you-wouldnt-base64-a-password-cryptography-decoded) –

+1

Dzięki, fajny artykuł! – user3746259

Odpowiedz

2

Uaktualnij do Symfony3.

BCryptPasswordEncoder.php linia 75:

if ($salt) { 
    // Ignore $salt, the auto-generated one is always the best 
} 
+1

Nie mogę uaktualnić, ponieważ wiele innych pakietów kompozytora zależy od Symfony 2.X, podobnie jak projekt Sonata. Większość pakietów nie jest jeszcze uaktualniona do pracy z symfony3 – user3746259

+0

Możesz więc spróbować ustawić wartość salt użytkownika na null w jednostce/dokumencie użytkownika. – malcolm

+0

Pomyśleliśmy o tym, ale wtedy sól zawsze byłaby zerowa i nie mogłem zapisać/użyć automatycznie wygenerowanego. Zobacz nr 2) – user3746259

1

można ustawić $ atrybut sól jest null nadrzędnymi FOS \ UserBundle \ Modele \ użytkownik

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", 
*    [email protected]\Column(name="salt", type="string", nullable=true) 
*   ) 
*  }) 
* 
*/ 
class User extends BaseUser 
{ 

    /** 
    * User constructor. 
    */ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->salt = null; 
    } 

    //another codes 
}