2012-01-07 9 views
5

Quiero moverme a Symfony2, porque estoy totalmente impresionado por su modernidad y buena programación.FOSUserBundle: Contraseña personalizada/Migración desde la antigua estructura DB

Ahora estoy tomando una tabla de usuarios de mi antiguo sistema, con 10,000 usuarios, y no quiero enojarlos haciéndoles establecer una nueva contraseña ... así que quiero que puedan iniciar sesión con su antigua contraseña

Aquí es pseudo-código de cómo mi tabla de usuarios parece que con 3 campos principales en relación entrada/registro:

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

en registro, los datos se genera de esta manera:

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

en entrada, los datos se comprueba la siguiente manera:

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

Entonces, ¿cómo lo manejo mejor en FOSUserBundle, sin tener que editar demasiados archivos?

Respuesta

11

Es necesario crear un codificador de contraseña personalizada:

<?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)); 
    } 
} 

y configurarlo en security.yml:

services: 
    my_password_encoder: 
     class: MyPasswordEncoder 

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

Mientras User::getSalt() vuelve secret y User::getPassword() devuelve passhash debe ser bueno ir.

+0

gracias Kris, muy bien explicado. Pero, ¿dónde pego mi codificador de contraseña? – Confidence

+0

Puedes poner esa clase en uno de tus paquetes. –

+1

aight, lo colocará en Security \ Encoder \ MyPasswordEncoder.php – Confidence

0

Es muy fácil de hacer con FOSUserBundle. Este es el código para ello:

$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

gracias pero no trabajo con la contraseña simple aquí. – Confidence

+0

Lo configura con el campo 'plainPassword' y FOSUserBundle o su propio codificador de seguridad lo codificarán. –

+0

Esto funcionará solo si comienza con una contraseña de texto sin formato. Si comienza con una contraseña codificada, tendrá una codificación doble. – elachance

Cuestiones relacionadas