FOSUserBundle para la gestion de usuarios en Symfony 2

Voy a explicar paso a paso como voy a integrar el bundle mas famoso de gestion de usuarios y acceso en un proyecto Symfony en el que estoy trabajando y justamente lo necesito, asi que voy a poner paso a paso el proceso que he seguido. He seguido la guia oficial de Symfony 2 para este bundle aqui.

Empezamos ¡¡

1- Instalacion del bundle

Abrir el composer.json y añadir la siguiente linea:

“friendsofsymfony/user-bundle”: “dev-master”

2- Ejecutar el comando para instalar los vendors:

>>composer update -o

3-Activar el bundle en la aplicación, abrimos /app/AppKernel.php y añadimos:

new FOS\UserBundle\FOSUserBundle()

4- Crea clase User que herede de la clase base del FOS e añadir el atributo id y el constructor que herede la logica del padre:

use FOS\UserBundle\Model\User as BaseUser;
/**
 * @ORM\Table(name="usuario")
 * @ORM\Entity
 */
class User extends BaseUser
{
    /**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

public function __construct()
{
    parent::__construct();
     //do domething
}
}

5- Configurar la seguridad en security.yml

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

    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_token_generator: security.csrf.token_manager
                # if you are using Symfony < 2.8, use the following config instead:
                # 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 }

6- Configurar el FOSUserBundle:

Yo suelo crear un fichero YML con cada configuracion para separarla del fichero config.yml y que no sea enorme en el tiempo. Para ello creo un nuevo fichero “/app/config/fos.yml” y añaimos lo siguiente y despues lo importamos en el config.yml:

# app/config/fos.yml
fos_user:
    db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel'
    firewall_name: main
    user_class: AppBundle\Entity\User

# app/config/config.yml
imports:
    - ...
    - { resource: fos.yml }

7- Importar las rutas de FOSUserBundle a nuestro routing.yml

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

8- Actualizar nuestro schema para añadir las nuevas columnas que usara el FOSUserBundle:

# Para ver los cambios en la base de datos
>> php bin/console doctrine:schema:update --dump-sql
# Para aplicar los cambios en la BD
>> php bin/console doctrine:schema:update --force

 Renombrando los campos que trae FOSUSerBundle por defecto

Debido a una serie de limitaciones respecto a la nomenclatura de la BD, algunos campos que ya existen coinciden con los que FOS trae por defecto como “email”, “password”, etc.

En mi caso, necesito forzar a que se coja el nombre y algun pequeño detalle mas de mi aplicacion, y que sobreescriba los del FOS.

En este caso, he tirado de Google y he descubierto que Doctrine2 trae un tipo  de anotaciones que permiten justamente esto que necesito, asi que seria algo como esto:

/**
 * @ORM\Table(name="fos_user")
 * @ORM\Entity(repositoryClass="UserBundle\Entity\Repositories\UserRepository")
 * @ORM\AttributeOverrides({
 *     @ORM\AttributeOverride(
 *          name="email",
 *          column=@ORM\Column(
 *              name        = "usuario_email",
 *              unique      = true,
 *              nullable    = false,
 *          )
 *     ),
 *     @ORM\AttributeOverride(
 *          name="password",
 *          column=@ORM\Column(
 *              name        = "usuario_password"
 *          )
 *     )
 * })
 */
class User extends BaseUser
{
    ...
}

De esta forma, cambiamos el nombre de las columnas de la tabla para que coja las nuestras y añadimos una restriccion de email unico y no nulo.

Y bueno, solo tenemos que aplicar los cambios del mapeo en la BD con el comando y listo.

>> php bin/console doctrine:schema:update --force

Si os surigio algun problema, o teneis alguna duda, no dudeis en preguntar via comentario y te contestare lo antes posible.

Saludos ¡¡

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s