Buy Access to Course
20.

Más configuración de form_login

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

Utilizar form_login no es tan flexible como una clase de autentificador personalizada... aunque se pueden configurar muchas cosas.

Por ejemplo, ahora mismo, no comprueba nuestro token CSRF. Habilita eso diciendo enable_csrf: true:

54 lines | config/packages/security.yaml
security:
// ... lines 2 - 16
firewalls:
// ... lines 18 - 20
main:
// ... lines 22 - 24
form_login:
// ... lines 26 - 29
enable_csrf: true
// ... lines 31 - 54

¡Eso es! En las opciones, cuando activas la protección CSRF, busca un campo oculto llamado _csrf_token con la cadena authenticate utilizada para generarlo. Afortunadamente, en nuestra plantilla, ya estamos utilizando ambas cosas... así que esto va a funcionar.

Ver la lista completa de opciones

Y hay aún más formas de configurarlo. Recuerda: para obtener esta configuración, he ejecutado debug:config security... que muestra tu configuración actual, incluyendo los valores por defecto. Pero aquí no se muestran todas las opciones. Para ver una lista completa, ejecutaconfig:dump security.

symfony console config:dump security

En lugar de mostrar tu configuración actual, esto muestra una enorme lista de configuraciones de ejemplo. Esta es una lista mucho más grande... aquí está form_login. Mucho de esto lo hemos visto antes... pero success_handler y failure_handler son nuevos. Puedes buscarlos en la documentación para aprender a controlar lo que ocurre tras el éxito o el fracaso.

Pero también, más adelante, vamos a conocer una forma más global de engancharse al proceso de éxito o fracaso registrando un oyente de eventos.

Renderización de "último_nombre_de_usuario" en el formulario de inicio de sesión

De todos modos, ya no vamos a utilizar nuestro LoginFormAuthenticator, así que puedes eliminarlo.

Y... ¡Tengo buenas noticias! ¡El autentificador principal está haciendo una cosa que nuestra clase nunca hizo! En authenticate()... llama a getCredentials() para leer los datos POST. Déjame buscar "sesión"... ¡yup! Esto me llevó agetCredentials(). De todos modos, después de coger el correo electrónico enviado - en este código que se almacena como $credentials['username'] - guarda ese valor en la sesión.

Lo hace para que, si falla la autenticación, podamos leerlo y rellenar previamente la casilla del correo electrónico en el formulario de acceso.

¡Vamos a hacerlo! Ve a nuestro controlador: src/Controller/SecurityController.php. EsteAuthenticationUtils tiene otro método útil. Pasa una nueva variable a la plantilla llamada last_username -puedes llamarla last_email si quieres- y ponla en $authenticationUtils->getLastUsername():

31 lines | src/Controller/SecurityController.php
// ... lines 1 - 9
class SecurityController extends AbstractController
{
// ... lines 12 - 14
public function login(AuthenticationUtils $authenticationUtils): Response
{
return $this->render('security/login.html.twig', [
// ... line 18
'last_username' => $authenticationUtils->getLastUsername(),
]);
}
// ... lines 22 - 29
}

Una vez más, esto es sólo un ayudante para leer una clave específica de la sesión.

Ahora, en la plantilla - login.html.twig - aquí arriba en el campo de correo electrónico, añadevalue="{{ last_username }} ":

39 lines | templates/security/login.html.twig
// ... lines 1 - 4
{% block body %}
<div class="container">
<div class="row">
<div class="login-form bg-light mt-4 p-4">
<form method="post" class="row g-3">
// ... lines 10 - 15
<div class="col-12">
// ... line 17
<input type="email" name="email" id="inputEmail" class="form-control" value="{{ last_username }}" required autofocus>
</div>
// ... lines 20 - 33
</form>
</div>
</div>
</div>
{% endblock %}

¡Genial! Si vamos a /login... ¡ya está ahí por haber rellenado el formulario hace un minuto! Si introducimos un correo electrónico diferente... ¡sí! Eso también se pega.

A continuación: volvamos a la autorización aprendiendo a denegar el acceso en un controlador... de varias maneras.