2012-01-07 3 views
5

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

Теперь я беру таблицу пользователей из своей старой системы с 10 000 пользователей, и я не хочу их раздражать, создавая им новый пароль .... поэтому я хочу, чтобы они могли входить в систему с помощью их старый пароль

Вот псевдо-код, как моя таблица пользователей выглядит как с 3-мя основными полями относительно входа/регистрации:

id, int(10) unsigned NOT NULL 
username varchar(40) NOT NULL 
passhash varchar(32) NOT NULL 
secret varchar(20) NOT NULL 

на регистрацию, данные получает генерируется следующим образом:

$secret = mksecret(); 
$passhash = md5 ($secret . $password_formfield . $secret); 

на логин, данные получает проверяется следующим образом:

if ($row['passhash'] != md5 ($row['secret'] . $password_formfield . $row['secret'])) 
{ 
//show login error 
} 

Так как я справиться с этим лучше в FOSUserBundle, без необходимости редактирования слишком много файлов?

ответ

11

Вам нужно создать пользовательский пароль кодировщик:

<?php 

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

class MyPasswordEncoder extends BasePasswordEncoder 
{ 
    public function encodePassword($raw, $salt) 
    { 
     return md5($salt.$raw.$salt); 
    } 

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

и настроить его в security.yml:

services: 
    my_password_encoder: 
     class: MyPasswordEncoder 

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: { id: my_password_encoder } 

Пока User::getSalt() возвращается secret и User::getPassword() возвращает passhash, вам должно быть хорошо идти.

+0

спасибо Крису, очень хорошо объяснил. Но где я вставляю свой пароль-кодер? – Confidence

+0

Вы можете поместить этот класс в один из ваших пакетов. –

+1

aight, поместит его под Security \ Encoder \ MyPasswordEncoder.php – Confidence

0

Это очень легко сделать с FOSUserBundle. Это код для него:

$userManager = $this->get('fos_user.user_manager'); 

foreach ($items as $item) { 
    $newItem = $userManager->createUser(); 

    //$newItem->setId($item->getObjId()); 
    // FOSUserBundle required fields 
    $newItem->setUsername($item->getUsername()); 
    $newItem->setEmail($item->getEmail()); 
    $newItem->setPlainPassword($item->getPassword()); // get original password 
    $newItem->setEnabled(true); 

    $userManager->updateUser($newItem, true); 
} 
+0

спасибо, но я не работаю с простым паролем здесь. – Confidence

+0

Вы устанавливаете его с помощью поля 'plainPassword', и оно будет закодировано FOSUserBundle или вашим собственным кодеком безопасности. –

+0

Это будет работать, только если вы начинаете с обычного текстового пароля. Если вы начинаете с закодированного пароля, у вас будет двойное кодирование. – elachance

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

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