Nuevo en Symfony 3.4: mejoras en el autenticador Guard

El componente Guard combina varias funcionalidades internas de autenticación para simplificar al máximo la creación de sistemas de autenticación personalizados. En Symfony 3.4 hemos añadido algunas mejoras a Guard.

En primer lugar, la interfaz Symfony\\Component\\Security\\Guard\\GuardAuthenticatorInterface se ha declarado obsoleta y se eliminará en Symfony 4.0. Utiliza la interfaz Symfony\\Component\\Security\\Guard\\AuthenticatorInterface en su lugar.

Por otra parte, el método getCredentials() ya no tiene dos responsabilidades. Antes, si devolvías null en este método, el autenticador no se aplicaba. Ahora, si devuelves null verás un error de tipo \UnexpectedValueException.

La lógica que permite saltarse un autenticador se ha pasado del método getCredentials() al nuevo método supports(), que devuelve un valor booleano indicando si el autenticador debe aplicarse o no para esta petición. En la práctica:

// Así se hacía ANTES en Symfony 3.3
use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
 
class TokenAuthenticator extends AbstractGuardAuthenticator
{
    public function getCredentials(Request $request)
    {
        if (!$token = $request->headers->get('X-AUTH-TOKEN')) {
            return null;
        }
 
        return ['token' => $token];
    }
}
// Así se hace AHORA en Symfony 3.4
class TokenAuthenticator extends AbstractGuardAuthenticator
{
    public function supports(Request $request)
    {
        return $request->headers->has('X-AUTH-TOKEN');
    }
 
    public function getCredentials(Request $request)
    {
        return ['token' => $request->headers->get('X-AUTH-TOKEN')];
    }
}

Esta separación de responsabilidades de supports() y getCredentials() permitirá crear autenticadores más específicos para cada necesidad. Por ejemplo, podrías crear un atenticador base en una clase abstracta o un trait (ej. ApiBaseAuthenticator.php) que contenga toda la lógica común de autenticación (métodos getUser(), checkCredentials(), createAuthenticatedToken(), etc.). Después, crearías otras clases finales (ej. ApiHeaderAuthenticator.php, ApiPayloadAuthenticator.php, etc.) que implementen las diferentes estrategias de autenticación (métodos supports() y getCredentials()):

tu-proyecto/
└── src/
    └── Security/
        └── Authenticator
            ├── ApiBaseAuthenticator.php
            ├── ApiHeaderAuthenticator.php
            ├── ApiPayloadAuthenticator.php
            └── ApiQueryAuthenticator.php

Esta funcionalidad fue contribuida por Amaury Leroux de Lens y Robin Chalas en el pull request #16835.

Fuente: New in Symfony 3.4: Guard authentication improvements

Comentarios

Publicada el

18 de octubre de 2017

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.