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.