Symfony2: Crear nuestro propio encoder/encriptador de contraseñas
Symfony2 cuenta con su propio encoder de contraseñas que podemos utilizar sin mayor problema. En el siguiente enlace podemos encontrar más información de como utilizarlo:
http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password
En este tutorial vamos a crear nuestro propio encoder/encriptador de contraseñas de usuario en Symfony2. Para ello crearemos un nuevo Service e indicaremos a la Entity de usuarios que lo utilice.
Por supuesto, la Entity de usuarios debe estar preparada para controlar los usuarios. En la documentación oficial está bien explicado: http://symfony.com/doc/current/book/security.html#loading-users-from-the-database
Empezamos creando nuestro Service, implementando nuestro encriptador personalizado para la contraseña:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Acme/UserBundle/Service/MyPassEncoder.php namespace Acme\UserBundle\Service; use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface; class MyPassEncoder implements PasswordEncoderInterface { public function encodePassword($raw, $salt) { // Implementamos nuestro encoder personalizado return hash('sha1', $salt . $raw); } public function isPasswordValid($encoded, $raw, $salt) { return $encoded === $this->encodePassword($raw, $salt); } } |
Añadimos nuestro encoder en el archivo services.yml del bundle:
1 2 3 4 | # Acme/UserBundle/Resources/config/services.yml services: mypassencoder_encoder: class: Acme\UserBundle\Service\MyPassEncoder |
Finalmente, en el archivo security.yml indicamos que nuestra Entity de usuarios va a utilizar nuestro encoder personalizado:
# app/config/security.yml
security:
encoders:
Acme\UserBundle\Entity\User:
id: mypassencoder_encoder
A la hora de guardar la contraseña de un usuario en la base de datos, lo haremos de la siguiente manera.
1 2 3 4 5 6 7 8 | $factory = $this->get('security.encoder_factory'); $user = new Acme\UserBundle\Entity\User(); $user->setSalt(md5(time())); $encoder = $factory->getEncoder($user); $password = $encoder->encodePassword('user_password', $user->getSalt()); $user->setPassword($password); |
¿Para que podemos necesitar crear un encriptador personalizado para la contraseña? Por ejemplo, nos podemos encontrar el caso de tener que migrar a Symfony2 un proyecto antiguo o que utilizaba otro framework, queriendo que los usuarios puedan seguir logueándose con sus datos actuales.
Si en el sistema antiguo se utilizaba un encriptador personalizado, deberemos recrearlo en nuestro proyecto en Symfony2 para que siga funcionando.
Muy bueno fucniona de maravilla