Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

composer require seguridad

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

¡Bienvenidos de nuevo amigos! Estoy muy contento de que hayáis tropezado con mi tutorial de seguridad de Symfony 5 por un montón de razones. La primera es que, bueno... eh... el sitio que hemos estado construyendo NO tiene seguridad... y los rapaces están empezando a sacudir los pomos de las puertas.

La otra razón es que, una vez que lleguemos al cobertizo de mantenimiento en el otro lado del recinto, vamos a explorar el nuevo sistema de seguridad de Symfony, llamado sistema "autentificador". Ooh. Si has utilizado el sistema antiguo, te sentirás como en casa. Si eres nuevo en la seguridad de Symfony, has elegido un buen momento para empezar. El nuevo sistema es más fácil de aprender y entender... pero también es más potente.

Configuración del Proyecto

Y como el sistema de seguridad no se va a poner en marcha por sí solo, pongámonos a trabajar. Para aprender a autenticar, autorizar y hacer otras cosas interesantes de seguridad a nivel profesional, deberías descargar el código del curso desde esta página y codificar conmigo. Cometer errores en el mundo real.... sí, es la mejor manera de recordar estas cosas.

Después de descomprimir el archivo, encontrarás un directorio start/ con el mismo código que ves aquí. Abre el archivo README.md para obtener todas las instrucciones de configuración. El último paso será buscar un terminal, entrar en el proyecto e iniciar un servidor web. Para ello voy a utilizar el binario symfony:

symfony serve -d

Esto inicia un nuevo servidor en https://127.0.0.1:8000. Ábrelo en tu navegador... o sé perezoso y ejecuta

symfony open:local

para... "delegar" el trabajo a otra persona. ¡Saluda a Cauldron Overflow! Un sitio de preguntas y respuestas para brujas y magos, que... por desgracia... siguen lanzando sus hechizos en directo en producción sin probarlos... y normalmente un viernes por la tarde. Por supuesto. Luego vienen aquí a preguntar cómo deshacer el daño.

Instalando Seguridad

Como la filosofía de Symfony es empezar poco a poco y permitirte instalar las cosas que necesitas más tarde, ahora mismo nuestra aplicación... no tiene literalmente un sistema de seguridad.

Eso no es divertido, ¡así que vamos a instalar uno! Vuelve a tu terminal y ejecuta:

composer require security

Esto instala el paquete de seguridad de Symfony. Cuando termine... ejecuta

git status

para ver lo que hizo su receta. Además de las cosas normales, ha añadido un nuevo archivo de configuración: security.yaml. Vamos a comprobarlo:config/packages/security.yaml:

security:
# https://symfony.com/doc/current/security/authenticator_manager.html
enable_authenticator_manager: true
# https://symfony.com/doc/current/security.html#c-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
users_in_memory: { memory: null }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
lazy: true
provider: users_in_memory
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#firewalls-authentication
# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
# - { path: ^/admin, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }

Como habrás adivinado por su nombre, ¡este archivo alimenta el sistema de seguridad! Cuando terminemos, cada sección de aquí te resultará sencilla y aburrida. Me encanta cuando las cosas de programación son aburridas.

enable_authenticator_manager

Oh, ¿pero ves esta clave enable_authenticator_manager?

security:
# https://symfony.com/doc/current/security/authenticator_manager.html
enable_authenticator_manager: true
... lines 4 - 29

En Symfony 5.3 -la versión que estoy utilizando- los sistemas de seguridad antiguos y nuevos conviven y puedes elegir cuál quieres Cuando ponesenable_authenticator_manager en true, estás activando el nuevo sistema. ¡Sí! ¡Brillante! Si estás trabajando en un proyecto heredado y necesitas aprender el sistema antiguo, echa un vistazo a nuestro tutorial Seguridad en Symfony 4. ¡También es muy bueno!

Autenticación y Autorización

De todos modos, cuando se habla de seguridad, hay dos grandes partes: la autenticación y la autorización. La autenticación plantea la pregunta "¿quién eres? Y "¿puedes demostrarlo?" Los usuarios, los formularios de inicio de sesión, las cookies "recuérdame", las contraseñas, las claves API... todo eso está relacionado con la autenticación.

La autorización plantea una pregunta diferente: "¿Deberías tener acceso a este recurso?" A la autorización no le importa mucho quién eres... se trata de permitir o denegar el acceso a diferentes cosas, como diferentes URLs o controladores.

En Symfony, o realmente en cualquier sistema de seguridad, la autenticación es la parte complicada. Quiero decir, ¡sólo piensa en cuántas formas hay de autenticarse! Formularios de inicio de sesión, autenticación con tokens de la API, autenticación social con OAuth, SSO, LDAP, ponerse un bigote falso y pasar con confianza por delante de un guardia de seguridad. Es decir... las posibilidades son infinitas. Pero también creo que la autenticación es súper divertida.

Así que a continuación: vamos a empezar nuestro viaje hacia el nuevo y brillante sistema de autenticación creando la parte más básica de la autenticación: una clase de usuario.

Leave a comment!

¡Este tutorial también funciona muy bien para Symfony 6!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": "^7.4.1 || ^8.0.0",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "babdev/pagerfanta-bundle": "^3.3", // v3.3.0
        "composer/package-versions-deprecated": "^1.11", // 1.11.99.4
        "doctrine/annotations": "^1.0", // 1.13.2
        "doctrine/doctrine-bundle": "^2.1", // 2.6.3
        "doctrine/doctrine-migrations-bundle": "^3.0", // 3.1.1
        "doctrine/orm": "^2.7", // 2.10.1
        "knplabs/knp-markdown-bundle": "^1.8", // 1.9.0
        "knplabs/knp-time-bundle": "^1.11", // v1.16.1
        "pagerfanta/doctrine-orm-adapter": "^3.3", // v3.3.0
        "pagerfanta/twig": "^3.3", // v3.3.0
        "phpdocumentor/reflection-docblock": "^5.2", // 5.2.2
        "scheb/2fa-bundle": "^5.12", // v5.12.1
        "scheb/2fa-qr-code": "^5.12", // v5.12.1
        "scheb/2fa-totp": "^5.12", // v5.12.1
        "sensio/framework-extra-bundle": "^6.0", // v6.2.0
        "stof/doctrine-extensions-bundle": "^1.4", // v1.6.0
        "symfony/asset": "5.3.*", // v5.3.4
        "symfony/console": "5.3.*", // v5.3.7
        "symfony/dotenv": "5.3.*", // v5.3.8
        "symfony/flex": "^1.3.1", // v1.17.5
        "symfony/form": "5.3.*", // v5.3.8
        "symfony/framework-bundle": "5.3.*", // v5.3.8
        "symfony/monolog-bundle": "^3.0", // v3.7.0
        "symfony/property-access": "5.3.*", // v5.3.8
        "symfony/property-info": "5.3.*", // v5.3.8
        "symfony/rate-limiter": "5.3.*", // v5.3.4
        "symfony/runtime": "5.3.*", // v5.3.4
        "symfony/security-bundle": "5.3.*", // v5.3.8
        "symfony/serializer": "5.3.*", // v5.3.8
        "symfony/stopwatch": "5.3.*", // v5.3.4
        "symfony/twig-bundle": "5.3.*", // v5.3.4
        "symfony/ux-chartjs": "^1.3", // v1.3.0
        "symfony/validator": "5.3.*", // v5.3.8
        "symfony/webpack-encore-bundle": "^1.7", // v1.12.0
        "symfony/yaml": "5.3.*", // v5.3.6
        "symfonycasts/verify-email-bundle": "^1.5", // v1.5.0
        "twig/extra-bundle": "^2.12|^3.0", // v3.3.3
        "twig/string-extra": "^3.3", // v3.3.3
        "twig/twig": "^2.12|^3.0" // v3.3.3
    },
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.3", // 3.4.0
        "symfony/debug-bundle": "5.3.*", // v5.3.4
        "symfony/maker-bundle": "^1.15", // v1.34.0
        "symfony/var-dumper": "5.3.*", // v5.3.8
        "symfony/web-profiler-bundle": "5.3.*", // v5.3.8
        "zenstruck/foundry": "^1.1" // v1.13.3
    }
}