Миграция старых пользователей на symfony2

Я перехожу с expressionengine на symfony2 и ищу лучший способ перенести пароли пользователей. Цель состоит в том, чтобы позволить устаревшим пользователям входить в систему с их существующими учетными данными, в то время как пароли для новых пользователей создаются по умолчанию.

Я просмотрел пользовательских провайдеров аутентификации и пользовательских провайдеров и подумал о том, создавать ли отдельный объект для устаревших пользователей или нет, но я не знаю, что было бы лучшим способом/проектом для достижения вышеизложенного.

К вашему сведению:

  • Насколько я понимаю, expressionengine просто шифрует пароль с помощью sha1 и все.
  • В настоящее время я использую FOSUserBundle.

Может ли кто-нибудь посоветовать мне решение?


person Thomas K    schedule 17.08.2012    source источник
comment
Я думаю, что лучшим решением будет повторно импортировать всех пользователей в таблицу fos_user. Поскольку FOSUserBundle использует SHA1, пароли не должны быть проблемой.   -  person Florent    schedule 20.08.2012
comment
Я думаю, что FOSUserBundle использует sha512   -  person Thomas K    schedule 20.08.2012
comment
Вы можете настроить фабрику кодировщика для использования вашего любимого алгоритма хеширования.   -  person Florent    schedule 20.08.2012
comment
Да, я понимаю. Однако мне нужно поддерживать обоих пользователей, старых и новых. Мне нужно знать, какой дизайн использовать для достижения этого   -  person Thomas K    schedule 20.08.2012
comment
Напишите сценарий для импорта старых пользователей в таблицу новых пользователей.   -  person Florent    schedule 21.08.2012
comment
Хорошо, а как тогда преобразовать пароли sha1 в sha512?   -  person Thomas K    schedule 21.08.2012
comment
Вам не нужно, вы просто настраиваете sha1 в качестве алгоритма пароля.   -  person Sherlock    schedule 21.08.2012
comment
Хорошо, но я бы предпочел использовать sha512 в качестве алгоритма для новых пользователей. Поэтому я хочу поддержать обоих.   -  person Thomas K    schedule 21.08.2012


Ответы (2)


Догадаться!

Создайте собственный кодировщик и используйте пакет FOSAdvancedEncoder, чтобы выбрать соответствующий кодировщик.

<сильный>1. Создайте кодировщик

    <?php

    namespace Acme\MyBundle\Security\Encoder;

    use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;

    class LegacyEncoder implements PasswordEncoderInterface {

        public function encodePassword($raw, $salt)
        {
            // Your Custom encoder logic
            return $something 
        }

        public function isPasswordValid($encoded, $raw, $salt)
        {
            return $encoded === $this->encodePassword($raw, $salt);
        }

    }

<сильный>2. Зарегистрируйте кодировщик как службу

services:
    acme.legacy_encoder:
        class: Acme\MyBundle\Security\Encoder\LegacyEncoder

<сильный>3. Установите пакет FOSAdvancedEncoderBundle

Посмотрите здесь: https://github.com/friendsofsymfony/FOSAdvancedEncoderBundle/blob/master/Resources/doc/index.md

<сильный>4. Настройте кодировщики

In app/config.yml:

fos_advanced_encoder:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512
        legacy_encoder:
            id: acme.legacy_encoder

<сильный>5. Реализуйте интерфейс с поддержкой кодировщика в своем пользовательском классе

use FOS\AdvancedEncoderBundle\Security\Encoder\EncoderAwareInterface;
use FOS\UserBundle\Entity\User as BaseUser;

class User extends BaseUser implements EncoderAwareInterface {

  ...

  public function getEncoderName() {

      if($this->islegacy()) {
          return "legacy_encoder";
      }

      return NULL;
  }

}

Не забудьте добавить логическое поле для администрирования, если пользователь является устаревшим пользователем или нет.

Вот и все.

person Thomas K    schedule 22.08.2012

Возможно, вам поможет ветка об экспорте участников из ExpressionEngine в Wordpress.

Не вижу никаких сложностей, кроме экспорта результатов пользовательского запроса в структуру FOSUserBundle.

Важно помнить:

  • Как отмечает Дерек Хог в этой теме, пользователям, скорее всего, придется сбросить свои пароли.
  • Вам нужно будет очень хорошо понимать обе структуры, чтобы правильно импортировать данные.
person Daniel Ribeiro    schedule 22.08.2012
comment
Извините, это не сработает. Как я заявляю в своем вопросе: The goal is to let legacy users log in with their existing credentials, while passwords for new users are created the default way. - person Thomas K; 22.08.2012
comment
Да, это сработает. Вы можете просто сохранить хэш каждого пароля вместо того, чтобы просить пользователей сбросить их. - person Daniel Ribeiro; 22.08.2012
comment
Я проверил это, и это не будет. Это потому, что Symfony основывает хешированный пароль на комбинации соли и простого пароля. EE просто использует хешированный sha1 вариант простого пароля. - person Thomas K; 22.08.2012
comment
Конечно, волшебным образом это не сработает. Вы разработчик, верно? Вам придется проделать некоторую адаптационную работу, чтобы все заработало, как ожидалось. Вы можете либо изменить security: encoders: FOS\UserBundle\Model\UserInterface: sha512 на правильный хеш и быть счастливым, либо написать некоторый собственный код для обработки случая новых пользователей и старых пользователей. - person Daniel Ribeiro; 22.08.2012