FosUserBundle - Part 1. Instalación y configuración

10 de abril de 2015

El FOSUserBundle agrega soporte para un sistema de respaldado de usuarios en la base de datos Symfony. Proporciona un marco flexible para la gestión de usuarios que tiene como objetivo manejar tareas comunes tales como el registro de usuarios y de recuperación de contraseña.

Incluye las características:

  • Soporte para almacenar los usuario mediante Doctrine ORM, MongoDB/CouchDB ODM o Propel.
  • Soporte para el registro y envió de confirmación por email.
  • Soporte para el reseteo de contraseña
  • Pruebas unitarias

Nota: Es importante aclarar que el bundle no provee de un mecanísmo propio de autenticación, pero si un User Provide para ser usado por Symfony.

1.1 Introducción

La idea detras de este bundle es darnos un usuario base listo para trabajar en nuestras aplicaciones. Agrega funcionalidades básicas para comenzar con el trabajo de usuarios asegurando recursos públicos y privados, centrándote en tu propio negocio.

La clase FOS\UserBundle\Model\User provee de varios atributos siempre necesarios en las aplicaciones que requieren del manejo de usuario.

  • username: string
  • usernameCanonical: string
  • email: string
  • emailCanonical: string
  • enabled: boolean
  • salt: string
  • password: string
  • lastLogin: datetime
  • locked: boolean
  • expired: boolean
  • expiredAt: datetime
  • confirmationToken: string
  • passwordRequestedAt: datetime
  • roles: array
  • credencialsExpired: boolean
  • credencialsExpireAt: datetime

Para usarla solamente tienes que extenderlo en tu propia clase User y agregar el mappeo del $id.

<?php
// src/Acme/UserBundle/Entity/User.php
 
namespace AppBundle\Entity;
 
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity
 * @ORM\Table(name="app_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

1.2 Instalación

La instalación es bien sencilla, solo debes seguir los siguientes pasos:

1.3.1 Agrega la dependencia a composer.json:

$ php composer.phar require friendsofsymfony/user-bundle "~2.0@dev"

1.3.2 Habilita el bundle en AppKernel.php:

<?php
// app/AppKernel.php
 
public function registerBundles()
{
    $bundles = array(
        // ...
        new FOS\UserBundle\FOSUserBundle(),
    );
}

1.3.3 Crea tu propio usuario:

Como se explicaba en la introducción el bundle provee un usuario base, pero debes tener tu propio usuario para agregarle todos los atributos que desees. Inicialmente solo debes crear en algún bundle de tu aplicación la clase User y extenderlo deFOS\UserBundle\Model\User. Para mapear correctamente el usuario en la base de datos debes agregar solamente el mapeo del id mediante cualquier variante (anotaciones, php, yaml o xml), el bundle se encarga de mapear todos los demás atributos sin tener que hacer nada más.

1.3.4 Configura la seguridad de tu apliación

La opción más sencilla es simplemente sobreescribir el archivo security.yml de la apliación por esto:

# app/config/security.yml
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

En base a esta configuración muy simple puede realizar los cambios que estime conveniente para flexibilizar o ajustar más la seguridad en su aplicación. Para más información de la configuración del archivo security.yml por favor lea la documentación del componente de seguridad de Symfony2.

1.3.5 Configure el FOSUserBundle en tu aplicación

La configuración es muy sencilla para comenzar a trabajar con el bundle, solo debes agregar las siguientes lineas al archivo config.yml:

# app/config/config.yml
fos_user:
    db_driver: orm # otros valores válidos son 'mongodb', 'couchdb' and 'propel' depende de que gestor utilices
    firewall_name: main # Es el firewall configurado en el archivo security.yml en el paso 4
    user_class: AppBundle\Entity\User # Es el usuario de tu aplicación creado en el paso 3 y la introducción

1.3.6 Importa las rutas de las funcionalidades del bundle

El bundle provee de varias funcionalidades lista para usar en una aplicación real. Para que sean accesible desde la web debe agregarlas al routing de tu aplicación.

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

Si no desea agregar todas las funcionalidades puedes entrar al archivovendor/friendsofsymfony/user-bundle/Resources/config/routing/all.xml e ir copiando cada una de las rutas que necesite.

1.3.7 Actualiza el esquema de la base de datos

Solo falta actualizar la base de datos, en caso de usar Doctrine ORM sería mediante el comando:

$ php app/console doctrine:schema:update --force

Y listo!, ahora puedes probar las nuevas funcionalidades enhttp://localhost/app_dev.php/login

Mejorar el rendimiento de Symfony Cmf Dynamic Routing utilizando la opción de configuración uriFilterRegexp

He estado trabajando por un tiempo con Symfony Cmf (SfCmf) y he desarrollado algunos sitios con él. Además he creado algunos bundles extras para imple...


Mejorando la experiencia de desarrollar aplicaciones Symfony con Flex

Después de algún tiempo de espera tras anunciar Flex, ya se encuentra disponible y público lo que será el nuevo juguetito de los desarrolladores Symfo...


IMPRESIONES DEL SEGUNDO ENCUENTRO DE DESARROLLADORES HABANA.

Hace solo algunos días que conozco este grupo de entusiastas y emprendedores que se comunican mediante Google Group bajo el nombre de Desarrolladores...