Ver índice de contenidos del libro

Capítulo 9. Seguridad

9.1. Autenticación y firewalls

En las aplicaciones Symfony puedes autenticar a tus usuarios con cualquier método que definas y puedes cargar la información de los usuarios desde cualquier fuente. Como este es un tema bastante complejo, puedes echar un vistazo a los tutoriales oficiales sobre la seguridad de Symfony.

Independientemente de tus necesidades, la autenticación se configura en el archivo security.yml bajo la clave firewalls.

Buena Práctica A menos que definas dos mecanismos de autenticación diferentes (ejemplo, formulario de login para el sitio y sistema de tokens para la API) define un único firewall en tu aplicación con la opción anonymous activada.

La mayoría de aplicaciones solamente utilizan un mecanismo de autenticación y un conjunto de usuarios. Por eso te basta con tener un único firewall. Una excepción válida es cuando utilizas más de un mecanismo de autenticación, como por ejemplo cuando dispones de una API protegida.

Además, deberías activar siempre la opción anonymous del firewall. Para restringir el acceso a las diferentes partes de la aplicación, utiliza la configuración de la opción access_control.

Buena Práctica Utiliza bcrypt para codificar las contraseñas de tus usuarios.

Cuando se almacenan las contraseñas de los usuarios en el sistema, la recomendación consiste en utilizar el codificador bcrypt en vez del tradicional codificador basado en SHA-512. La principal ventaja de bcrypt es que ya incluye el salt como parte de la contraseña, lo que le protege frente a ataques de tipo rainbow table. Además, al tratarse de un algoritmo adaptativo, es posible ralentizar su ejecución para resistir mejor a los ataques de fuerza bruta.

Con todo esto, la configuración de la aplicación de prueba queda de la siguiente manera para utilizar un formulario de login y cargar los usuarios mediante la base de datos:

security:
    encoders:
        AppBundle\Entity\User: bcrypt

    providers:
        database_users:
            entity: { class: AppBundle:User, property: username }

    firewalls:
        secured_area:
            pattern: ^/
            anonymous: true
            form_login:
                check_path: security_login_check
                login_path: security_login_form

            logout:
                path: security_logout
                target: homepage
 
# No se muestra la sección 'access_control'

Truco El código fuente de la aplicación de prueba incluye comentarios que explican detalladamente cada parte de este archivo.