Loguear un usuario manualmente en Symfony2

marzo 21, 2014

Es posible que queramos loguear automaticamente a un usuario en Symfony2 sin que haga falta que introduzca su email y contraseña. El caso típico es cuando un usuario se acaba de registrar en nuestra web y queremos loguearle en el sistema sin que tenga que volver a introducir sus datos.

En versiones anteriores a Symfony 2.3, este código funcionaba correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// security.yml
providers:
    main:
        entity: { class: ApplicationBundleDefaultBundleEntityUser, property: username }
 
firewalls:  
    secured_area:
        pattern:    ^/
        form_login:
            check_path: /login_check
            login_path: /login
        logout:
            path:   /logout
            target: /
        anonymous: ~

Y en nuestro código teníamos lo siguiente:

1
2
3
4
$user = $em->getRepository('ApplicationDefaultBundle:User')->findOneBy(array('id' => 117));
$provider_name = "main";
$token = new UsernamePasswordToken($user, null, $provider_name, $user->getRoles());
$this->get('security.context')->setToken($token);

A partir de Symfony 2.3, esto ha cambiado un poco. En el código anterior vemos que a la clase UsernamePasswordToken le pasamos el nombre del provider como tercer parámetro.

En Symfony2 >= 2.3 tenemos que pasar el nombre del firewall y en el security.yml, especificar que provider utiliza ese firewall.

Lo vemos a continuación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// security.yml
providers:
    main:
        entity: { class: ApplicationBundleDefaultBundleEntityUser, property: username }
 
firewalls:  
    secured_area:
        pattern:    ^/
        provider: main # añadimos el nombre del provider a utilizar
        form_login:
            check_path: /login_check
            login_path: /login
        logout:
            path:   /logout
            target: /
        anonymous: ~

Y el código lo modificaremos de la siguiente forma:

1
2
3
4
$user = $em->getRepository('ApplicationDefaultBundle:User')->findOneBy(array('id' => 117));
$firewall_name = "secured_area"; // Ahora utilizamos el nombre del firewall
$token = new UsernamePasswordToken($user, null, $firewall_name, $user->getRoles());
$this->get('security.context')->setToken($token);

Espero que os sirva de ayuda 🙂

Tags ; , , , ,

1 comentario

    Miguel Jose Abr 07, 2014

    Muy util, sobre todo cuando usas cuentas de Facebook o Twitter para logear usuarios.

    Responder

Escribe un comentario

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