2014-09-09 3 views
2

Если у вас есть существующая база кода с пользователями и их паролями, как вы можете изменить кодировщик паролей и обновить пароли пользователей?Symfony2 - Изменение кодировщиков для существующих пользователей

Другими словами, все пароли пользователей находятся в MD5 и вы хотите перейти на PBKDF2. Общая стратегия состоит в том, чтобы просто повторно использовать пароль при каждом входе пользователя в систему.

Однако я не уверен, как это сделать в Symfony. Будет ли это сделано в контроллере входа? Или есть способ сделать это в объекте EncoderInterface?

ответ

3

Проверьте этот блог ... Кажется, это то, что вы ищете ...

How to change the way Symfony2 encodes passwords

Вам необходимо расширить MessageDigestPasswordEncoder класс, перезаписать свои методы и скопировать этот класс в безопасности папка в вашей связке (создать, если не существует) Отъезд следующий пример того, как продлить MessageDigestPasswordEncoder

use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder as  BaseMessageDigestPasswordEncoder; 

class MessageDigestPasswordEncoder extends BaseMessageDigestPasswordEncoder 
{ 
    private $algorithm; 
    private $encodeHashAsBase64; 

    public function __construct($algorithm = 'sha512', $encodeHashAsBase64 = true, $iterations = 5000) 
    { 
     $this->algorithm = $algorithm; 
     $this->encodeHashAsBase64 = $encodeHashAsBase64; 
     $this->iterations = $iterations; 
    } 

    protected function mergePasswordAndSalt($password, $salt) 
    { 
     if (empty($salt)) { 
      return $password; 
     } 

     return $salt.$password; // or do whatever you need with the password and salt 
    } 

    public function encodePassword($raw, $salt) 
    { 
     // this is the original code from the extended class, change it as needed 

     if (!in_array($this->algorithm, hash_algos(), true)) { 
      throw new \LogicException(sprintf('The algorithm "%s" is not supported.', $this->algorithm)); 
     } 

     $salted = $this->mergePasswordAndSalt($raw, $salt); 
     $digest = hash($this->algorithm, $salted, true); 

     // "stretch" hash 
     for ($i = 1; $i < $this->iterations; $i++) { 
      $digest = hash($this->algorithm, $digest.$salted, true); 
     } 

     return $this->encodeHashAsBase64 ? base64_encode($digest) : bin2hex($digest); 
    } 
} 

После того, как у вас есть класс готовы обновлять свой config.yml

# app/config/config.yml 
# ... 

parameters: 
    security.encoder.digest.class: Ens\TestBundle\Security\MessageDigestPasswordEncoder 
+0

Это не ясно из этого ответа, будет ли Symfony автоматически обрабатывать конкретную ситуацию в Аскере: переходе от одной кодировки пароля к другому, с существующими хранимыми паролями. Конфигурация Symfony позволяет достаточно легко изменить кодировщик, но то, что произойдет в следующий раз, когда пользователь войдет в систему, не описан. В идеале выбранная кодировка была бы сохранена в пользовательской записи, поэтому она могла бы декодировать старый способ до тех пор, пока он не будет обновлен, а затем закодировать новый способ сброса пароля (который может быть запущен в начале приложения). Это делает это? – frumious

+1

Ответчик спросил, откуда это должно быть сделано в Symfony «Будет ли это сделано в контроллере входа в систему? Или есть способ сделать это в объекте EncoderInterface?» и не так, он знает, как он описал общий способ сделать это. Ответ от описания был и как сделать ре-хэш только в Symfony. – iPeleg

+0

Из того, что я могу сказать, есть EncoderAwareInterface, поэтому можно использовать кодировщик на основе данного объекта User. Реальный вопрос заключается в том, где подходящим местом для размещения логики обновления является, то есть перестановка пароля в новый формат. – parent5446

 Смежные вопросы

  • Нет связанных вопросов^_^