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 ¡¡
Hola! Gracias por el post
Quisiera saber dónde creas…
«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:»
Gracias 🙂
Me gustaMe gusta