Ver índice de contenidos del libro

13.9. Cerrando sesión

Normalmente las aplicaciones web proporcionan algún mecanismo para que los usuarios puedan cerrar su sesión. Por suerte los firewalls de Symfony se pueden encargar automáticamente de esta tarea. Para ello, añade la opción de configuración logout:

# app/config/security.yml
security:
    firewalls:
        secured_area:
            # ...
            logout:
                path:   /logout
                target: /
    # ...
<!-- app/config/security.xml -->
<config>
    <firewall name="secured_area" pattern="^/">
        <!-- ... -->
        <logout path="/logout" target="/" />
    </firewall>
    <!-- ... -->
</config>
// app/config/security.php
$container->loadFromExtension('security', array(
    'firewalls' => array(
        'secured_area' => array(
            ...,
            'logout' => array('path' => 'logout', 'target' => '/'),
        ),
    ),
    // ...
));

Una vez configurado el firewall de esta manera, cada vez que envíes a un usuario a la URL /logout (o a la URL que hayas configurado en la opción path) provocará que el usuario se desautentique. Esto significa que el usuario será redirigido a la portada del sitio (que es el valor definido para la opción target). Los valores por defecto de las opciones path y target son los que se muestran en la configuración anterior. Así que a menos que necesites cambiar sus valores, puedes utilizar directamente la siguiente configuración:

logout: ~
<logout />
'logout' => array(),

No es necesario que crees un controlador para procesar la URL /logout porque el firewall se encarga de todo. Sin embargo, sí que es obligatorio crear una ruta para poder generar esa URL:

Advertencia A partir de Symfony 2.1 es obligatorio tener una ruta asociada a la URL de cerrar sesión. Si no existe esa ruta, el usuario no podrá cerrar su sesión.

# app/config/routing.yml
logout:
    path:   /logout
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
 
<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing
        http://symfony.com/schema/routing/routing-1.0.xsd">
 
    <route id="logout" path="/logout" />
 
</routes>
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
 
$collection = new RouteCollection();
$collection->add('logout', new Route('/logout', array()));
 
return $collection;

Una vez que el usuario ha cerrado la sesión, se le redirige a la ruta definida por el parámetro target anterior. Para más información sobre cómo configurar el cierre de sesión, consulta el artículo Security Configuration Reference.