Creación de usuarios en Symfony para administradores
Clase 11 de 17 • Curso de Symfony Framework
Nuevas pantallas de administrador: creación de usuarios
En la clase anterior vimos cómo armar el mecanismo para la creación de empresas y notamos que un punto necesario era la asociación de usuarios a esas empresas.
Es momento de dotar al administrador de la posibilidad de crear dichos usuarios.
Para ahorrarnos algo de trabajo usemos algo más de la magia de Symfony:
php bin/console make:crud
Con este simple comando generaremos:
- Un nuevo tipo de formulario
- Un nuevo controlador
- Una serie de templates para las operaciones básicas (Create, Read, Update, Delete).
Una vez finalizada su ejecución, si te diriges a [http://homestead.test/user](http://homestead.test/user)
te encontrarás con algo similar a:
No es muy vistoso, es cierto, pero es funcional.
Lo primero que notarás es que se está mostrando la contraseña (encriptada, claro)... algo que no debería suceder.
Abre el archivo templates/user/index.html
y elimina las líneas que hacen referencia a esta propiedad.
Al recargar la página te encontrarás con:
El tema de que está en inglés es fácil de solucionar, ¿cierto?
Pasemos a lo importante: ¿funciona la creación de un nuevo usuario?
Probemos siguiendo el enlace Create new:
¡PUM! ¿Qué ha pasado?
Nada grave realmente, solo se trata de un pequeño problema de conversión: fíjate que los roles del usuario son un string, pero no cualquier string: son un string json.
Dirígete un momento al archivo templates/user/new.html.
No hay demasiado ahí dentro, ¿cierto? Es un poco de decoración para un:
{{ include('user/_form.html.twig') }}
Con lo cual, la respuesta debe estar en el archivo templates/user/_form.html.
Este template tampoco aporta demasiado… se limita a hacer un render del form.
¿Y entonces? ¿Dónde está el problema?
Vayamos a ver el métodoUserController::new
que es el que genera esta pantalla.
Ahí puedes ver que se está utilizando el formulario App\Form\UserType.
Nada sospechoso, ¿cierto?
El problema surge de la configuración por defecto del widget utilizado para mostrar este arreglo ($roles
) como un campo de selección no-múltiple, cuando, al menos en teoría, un usuario podría tener más de un rol asignado.
La forma de corregirlo es tocar ligeramente la configuración del formulario:
En el archivo src/Form/UserType.php
cambia
->add('roles')
por:
->add('roles', ChoiceType::class, [ 'choices' => [ 'Administrador' => 'ROLE_ADMIN', 'Empresa' => 'ROLE_COMPANY', 'Postulante' => 'ROLE_APPLICANT', ], 'multiple' => true, 'expanded' => true, ] )
Y obtendrás una preciosa visualización como:
¡Genial! Lo que falta ahora es almacenar la contraseña en forma encriptada.
Para ello usaremos un servicio de Symfony: el UserPasswordEncoder
.
Lo primero que debemos hacer es declarar que lo haremos agregando al comienzo de nuestro script:
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
Y luego cambiaremos la definición del método new
por:
/** * @Route("/new", name="user_new", methods={"GET","POST"}) */ public function new(Request $request, UserPasswordEncoderInterface $encoder): Response { ... if ($form->isSubmitted() && $form->isValid()) { $entityManager = $this->getDoctrine()->getManager(); $user->setPassword($encoder->encodePassword($user, $user->getPassword())); $entityManager->persist($user); $entityManager->flush(); return $this->redirectToRoute('user_index'); } ... }
¡Perfecto! Ahora sí podemos crear nuevos usuarios que podrán ingresar a la aplicación :)
Lo que nos queda por hacer es asegurarnos de que solo los administradores puedan usar estas funcionalidades.
Nada del otro mundo, basta con un annotation bien colocado y asunto resuelto:
@IsGranted("ROLE_ADMIN")
Antes del comienzo de la definición de la clase será suficiente :)
Perfecto, ahora tenemos mecanismos para generar:
- Nuevas empresas
- Nuevos usuarios
Faltan algunos detalles del usuario administrador, es cierto, pero… ¿qué tal si nos ocupamos un rato de nuestros usuarios?
Acompáñame a la próxima clase a explorar la vista de la empresa.