fos passwords symfony md5 database-migration fosuserbundle

passwords - FOSUserBundle: contraseña personalizada/Migración desde la estructura de DB anterior



install fos user symfony (2)

Quiero pasar a Symfony2, porque estoy totalmente impresionado por su modernidad y buena programación.

Ahora tomo 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 contraseña anterior

Aquí hay un pseudocódigo de cómo se ve mi tabla de usuarios con 3 campos principales relacionados con el inicio de sesión / registro:

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

al registrarse , los datos se generan de esta manera:

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

al iniciar sesión , los datos se verifican de la siguiente manera:

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

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


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

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


Necesita crear un codificador de contraseña personalizado:

<?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 configúralo en security.yml :

services: my_password_encoder: class: MyPasswordEncoder security: encoders: FOS/UserBundle/Model/UserInterface: { id: my_password_encoder }

Siempre que User::getSalt() devuelva el secret y User::getPassword() devuelva passhash , debería estar listo.