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
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.