FOSUserBundle: Пользовательский пароль / Миграция из старой структуры БД - PullRequest
5 голосов
/ 07 января 2012

Я хочу перейти на Symfony2, потому что я полностью впечатлен его современностью и хорошим программированием.

Теперь я беру таблицу пользователей из моей старой системы с 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, не редактируя слишком много файлов?

Ответы [ 2 ]

11 голосов
/ 08 января 2012

Вам необходимо создать собственный кодировщик пароля:

<?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 голосов
/ 08 января 2012

Это очень легко сделать с помощью 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);
}
...