Nuevo en Symfony 5.1: Seguridad más sencilla

Para comprobar el estado de los usuarios en tu aplicación Symfony (anónimo, logueado, etc.) debes usar atributos de seguridad como IS_AUTHENTICATED_ANONYMOUSLY. Estos atributos son confusos a veces porque no comprueban realmente el estado del usuario sino que comprueban que se cumpla una condición.

Por ejemplo, el atributo IS_AUTHENTICATED_REMEMBERED es cierto tanto para los usuarios creados mediante "Remember Me" como para los usuarios autenticados por ejemplo con usuario y contraseña. En otras palabras, IS_AUTHENTICATED_REMEMBERED no significa "que sea Remember Me" sino "que sea al menos Remember Me".

Por eso, en Symfony 5.1 hemos añadido nuevos atributos de seguridad que solo comprueban el estado del usuario. Por ejemplo, para comprobar dentro de un controlador si el usuario es "Remember Me":

// Antes
if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')
    && !$this->isGranted('IS_AUTHENTICATED_FULLY')) {
    // ...
}
 
// Después
if ($this->isGranted('IS_REMEMBERED')) {
    // ...
}

Otro ejemplo, esta vez para comprobar si el usuario es anónimo dentro de una plantilla Twig:

{# Antes #}
{% if is_granted('IS_AUTHENTICATED_ANONYMOUSLY')
    and not is_granted('IS_AUTHENTICATED_REMEMBERED')
    and not is_granted('IS_AUTHENTICATED_FULLY') %}
    {# ... #}
{% endif %}
 
{# Después #}
{% if is_granted('IS_ANONYMOUS') %}
    {# ... #}
{% endif %}

Esta funcionalidad fue contribuida por Jules Pietri y Wouter De Jong en el pull request #31189.

Nuevo atributo para impersonar usuarios

La impersonación de usuarios te permite navegar la aplicación como si fueras otro usuario. Cuando se usa la impersonación, al usuario actual se le asigna automáticamente un rol llamado ROLE_PREVIOUS_ADMIN. Así es como puedes detectar si el usuario actual está impersonando o no.

No obstante, usar roles como si fueran atributos no es totalmente correcto. Además, el nombre del rol es un poco confuso. Así que en Symfony 5.1 hemos declarado obsoleto el rol ROLE_PREVIOUS_ADMIN y hemos añadido un nuevo atributo llamado IS_IMPERSONATOR. Así tu código y tus plantillas serán mucho más fáciles de entender:

{# Antes #}
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
    <a href="...">Exit impersonation</a>
{% endif %}
 
{# Después #}
{% if is_granted('IS_IMPERSONATOR') %}
    <a href="...">Exit impersonation</a>
{% endif %}

Esta funcionalidad fue contribuida por Wouter De Jong en el pull request #35858.


Fuente: New in Symfony 5.1: Simpler security attributes

Comentarios

Publicada el

17 de marzo de 2020

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.