Symfony2: Crear nuestro propio encoder/encriptador de contraseñas

octubre 9, 2014

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.

Tags ; , , , ,

1 comentario

    Jose Sep 26, 2016

    Muy bueno fucniona de maravilla

    Responder

Escribe un comentario

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.