Autenticación con FOSUserBundle y Propel en Symfony2

June 18, 2021

Tags: IT Staff ES 2024
Share

Table of contents

Quick Access

software development

 

En este artículo, exploraremos el manejo de usuarios en Symfony2, incluyendo las características básicas de su sistema de seguridad y cómo implementar en menos de 15 minutos un sistema eficiente de gestión de usuarios. También compartiremos consejos para evitar pérdida de tiempo buscando soluciones en internet, permitiéndote enfocarte en tu aplicación. Se asume que tienes conocimientos básicos de PHP y una instalación básica de Symfony2 para probar el código proporcionado.

 

Importancia del Manejo de Usuarios en Aplicaciones Web

El manejo de usuarios es una de las partes más sensibles en el desarrollo de aplicaciones web. Requiere tomar medidas de seguridad serias y, a menudo, se convierte en una tarea tediosa y repetitiva. Symfony2 incluye un sistema de seguridad robusto y completo, una de sus principales características. Sin embargo, no ofrece de forma predeterminada herramientas como formularios de inicio de sesión ni funcionalidades avanzadas para la gestión de usuarios.

 

Introducción a FOSUserBundle y Propel

Symfony2 puede integrarse con Propel, un ORM para PHP5 que facilita la manipulación de bases de datos mediante un conjunto de objetos. Este es uno de los bundles más utilizados y, anteriormente, formaba parte del núcleo de Symfony. Para simplificar aún más la gestión de usuarios, Friends Of Symfony (FOS) desarrolló el FOSUserBundle, que se adapta al componente de seguridad de Symfony2 y funciona perfectamente con Propel.

 

Ventajas de FOSUserBundle

  1. Ofrece una clase User.php predeterminada para gestionar usuarios.
  2. Proporciona formularios básicos para login, registro y restablecimiento de contraseñas.
  3. Permite una configuración rápida y sencilla.

 

Configuración Básica de FOSUserBundle

1. Configuración en security.yml

Añade las siguientes líneas en tu archivo de configuración:

 
providers:    fos_userbundle:        id: fos_user.user_provider.username firewalls:    main:        pattern: ^/        form_login:            provider: fos_userbundle            csrf_provider: security.csrf.token_manager        logout: true        anonymous: true access_control:    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY

 

Esta configuración:

  • Define un proveedor de seguridad que utiliza la clase fos_user.user_provider.username.
  • Permite el acceso a las rutas de login, registro y restablecimiento sin autenticación.

 

2. Configuración en config.yml

Configura FOSUserBundle para usar Propel y el firewall definido:

 
fos_user:    db_driver: propel    firewall_name: main    user_class: FOS\UserBundle\Propel\User 

 

3. Configuración en routing.yml

Carga las rutas de FOSUserBundle:

 
fos_user:    resource: "@FOSUserBundle/Resources/config/routing/all.xml" 

Esto cargará todas las rutas predeterminadas, aunque puedes personalizarlas si lo deseas.

 

Personalización de la Clase de Usuario

Si necesitas sobrescribir la clase User.php para añadir funcionalidades personalizadas, puedes hacerlo extendiendo la clase base y configurándola en config.yml:

 
fos_user:    db_driver: propel    firewall_name: main    user_class: Acme\MyBundle\Model\User 

 

Problema Común: Aunque esta configuración funciona inicialmente, pueden surgir errores durante el proceso de autenticación. Esto ocurre porque el proveedor de usuarios sigue esperando la clase original de FOSUserBundle.

 

Creación de un Proveedor de Usuarios Personalizado

Para resolver el problema anterior, es necesario crear un custom user provider que trabaje con tu clase personalizada.

 

1. Implementación del Custom User Provider

Crea un nuevo archivo para tu proveedor de usuarios:

 
namespace Acme\MyBundle\Security; use FOS\UserBundle\Security\UserProvider as BaseProvider; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; class UserProvider extends BaseProvider {    public function refreshUser(UserInterface $user)    {        if (!$this->supportsClass(get_class($user))) {            throw new UnsupportedUserException(sprintf('Expected instance of %s, but got "%s".', $this->userManager->getClass(), get_class($user)));        }        return parent::refreshUser($user);    } } 

 

2. Declaración del Servicio en services.yml

Registra el nuevo proveedor de usuarios como un servicio:

 
services:    my.user.provider:        class: Acme\MyBundle\Security\UserProvider        arguments: [@fos_user.user_manager.default]
 

3. Configuración en security.yml

Actualiza el proveedor de usuarios para usar tu servicio personalizado:

 
providers:    fos_userbundle:        id: my.user.provider 

 

Resolución de Problemas de Mapeo con GlorpenPropelBundle

En algunos casos, la clase personalizada no se mapeará correctamente en Propel. Para solucionarlo, utiliza GlorpenPropelBundle, que extiende las funcionalidades de Propel.

 

Instalación y Configuración

  1. Instala el bundle:

     
    composer require glorpen/propel-bundle 
  2. Configura en config.yml:

     
    build_properties:    propel.behavior.extend.class: 'vendor.glorpen.propel-bundle.Glorpen.Propel.PropelBundle.Behaviors.ExtendBehavior'    propel.behavior.default: "extend" glorpen_propel:    extended_models:        FOS\UserBundle\Propel\User: Acme\MyBundle\Model\User 

 

Con FOSUserBundle, puedes implementar rápidamente un sistema robusto de manejo de usuarios en Symfony2. Aunque el proceso de personalización puede presentar algunos retos, herramientas como GlorpenPropelBundle y custom user providers facilitan la integración de clases personalizadas.

 

Este tutorial proporciona una base sólida para gestionar usuarios en tu aplicación. Próximamente, exploraremos cómo integrar JWT para la gestión de sesiones en Symfony2. ¡No te lo pierdas!

 

Te recomendamos este video