PULSOFT

App de gestion de usuarios en Spring Security

Esta aplicación web, desarrollada con Java 21 y desplegada en Tomcat 10, utiliza Spring Framework 6.2.5 junto con Spring Security 6.4.4 para ofrecer un sistema completo de autenticación y autorización basado en roles. Está configurada como un Dynamic Web Module 6.0, lo que permite una integración eficiente con servidores de aplicaciones compatibles con Jakarta EE 10.

El sistema permite crear cuentas de usuario que se activan automáticamente al ser registradas. Los usuarios pueden iniciar sesión y acceder a una zona privada con funcionalidades específicas. Por otro lado, los administradores disponen de un área de gestión donde pueden desactivar o eliminar cuentas de usuario, garantizando así el control total del acceso, salvo sobre otras cuentas con rol administrador.

La aplicación diferencia claramente las vistas y funcionalidades accesibles por cada tipo de rol (usuario o administrador), aplicando filtros y restricciones a través de Spring Security. Toda la lógica del sistema se organiza mediante Spring MVC, mientras que el acceso a datos se gestiona con Hibernate y una base de datos MySQL.

En conjunto, se trata de una solución moderna, segura y escalable para proyectos que requieren gestión de usuarios, control de acceso por rol y administración desde un entorno web estructurado.

Spring Security

Ejercicio 1

Este ejercicio consiste en configurar una aplicación web basada en Spring MVC con soporte para persistencia JPA mediante Hibernate, gestión de transacciones, resolución de vistas con JSP, y acceso a una base de datos MySQL usando un pool de conexiones proporcionado por C3P0. La clase centraliza la configuración mediante anotaciones y beans definidos en Java en lugar de archivos XML. Se espera que el alumno entienda cómo se integran los distintos componentes de una aplicación empresarial moderna usando Spring Framework.

Ejercicio 2

Este ejercicio configura el inicializador del servlet para una aplicación Spring, extendiendo `AbstractAnnotationConfigDispatcherServletInitializer`. La clase define las configuraciones de raíz y de servlet necesarias para el funcionamiento de la aplicación web, incluyendo el mapeo de rutas y la configuración de los servicios y la capa MVC mediante las clases de configuración correspondientes.

Ejercicio 3

Este ejercicio se encarga de inicializar la configuración de seguridad de la aplicación web utilizando Spring Security. Al extender `AbstractSecurityWebApplicationInitializer`, la clase asegura que la configuración de seguridad de Spring se registre correctamente en el contenedor de servlet al momento de iniciar la aplicación.

Ejercicio 4

Este ejercicio configura la seguridad web de la aplicación utilizando Spring Security. Se encarga de definir un `PasswordEncoder` con BCrypt, configurar un `UserDetailsService` para la gestión de usuarios a través de JDBC y establecer un filtro de seguridad que defina qué recursos son accesibles y qué roles requieren permisos específicos. La configuración también incluye la gestión de sesiones, el login, y el manejo de errores de acceso denegado.

Ejercicio 5

Este ejercicio configura los niveles de log para diferentes componentes en la aplicación utilizando Logback y SLF4J. Se establece el nivel de log a DEBUG para varios paquetes importantes, como Spring Security, Spring Web y el paquete de la aplicación. Esto permite obtener más información detallada durante el desarrollo y la depuración.

Ejercicio 6

Este filtro intercepta las solicitudes HTTP entrantes y salientes, mostrando información de depuración en la consola, como la URL de la solicitud, el método HTTP, la cadena de consulta, el estado de la respuesta y la ubicación (si está presente) después de procesar la solicitud.

Ejercicio 7

Este filtro intercepta las solicitudes HTTP entrantes, mostrando información de depuración en la consola, como la URL de la solicitud, el método HTTP, la cadena de consulta, y los encabezados (headers) de la solicitud.

Mapeo ORM de la entidades

Ejercicio 8

Esta clase representa la entidad `Users` que se mapea a la tabla `users` en la base de datos. Almacena la información del usuario como nombre de usuario, contraseña, estado habilitado y su lista de autoridades (roles).

Ejercicio 9

Clase que representa una autoridad o rol asignado a un usuario. Está mapeada a la tabla "authorities" y utiliza una clave primaria compuesta formada por los campos "username" y "authority", definida en la clase AuthorityId.

Ejercicio 10

Clase que representa la clave primaria compuesta de la entidad Authority. Está formada por los campos "username" y "authority". Implementa Serializable, y se sobrescriben los métodos equals y hashCode para garantizar el correcto comportamiento en colecciones y frameworks JPA.

Controladores

Ejercicio 11

Controlador principal de la aplicación que gestiona las vistas asociadas al inicio, login, administración, usuarios, errores, registro y cambio de contraseña. Utiliza el servicio UsersService para obtener las listas de usuarios por rol y mostrarlas en la vista de inicio.

Ejercicio 12

Controlador encargado de gestionar las operaciones relacionadas con los usuarios. Incluye funcionalidades para crear cuentas, activar/desactivar usuarios, borrar, cambiar contraseñas y mostrar información de usuarios. Utiliza los servicios UsersService y AuthorityService, y codifica las contraseñas con PasswordEncoder.

Repositorios

Ejercicio 13

Clase UsersRepository --------------------- Implementa la capa de acceso a datos para la entidad Users utilizando EntityManager. Funcionalidades: - Buscar un usuario por su nombre de usuario. - Guardar o actualizar un usuario. - Buscar usuarios por rol. - Eliminar un usuario si no tiene el rol ROLE_ADMIN. Esta clase permite controlar de forma personalizada las operaciones sobre la tabla de usuarios, incluyendo validaciones para evitar la eliminación de administradores.

Ejercicio 14

Clase AuthorityRepository ------------------------- Esta clase proporciona acceso a la tabla Authority de la base de datos, gestionando los roles o autoridades asignadas a los usuarios. Funcionalidades: - Buscar una autoridad por nombre de usuario. - Eliminar una autoridad concreta asignada a un usuario. - Guardar o actualizar una autoridad. - Eliminar una autoridad desde una instancia de la entidad Authority. Utiliza EntityManager con anotación @PersistenceContext para interactuar con JPA.

Servicios

Ejercicio 15

Clase UsersService ------------------ Este servicio proporciona operaciones de alto nivel para gestionar usuarios. Facilita la interacción con la capa de persistencia (UsersRepository), encapsulando las operaciones CRUD relacionadas con los usuarios. Funcionalidades: - Agregar un nuevo usuario o actualizar uno existente. - Obtener un usuario por su nombre de usuario. - Obtener una lista de usuarios por su rol. - Eliminar un usuario por su nombre de usuario. Utiliza transacciones con la anotación @Transactional para garantizar la consistencia de las operaciones de escritura.

Ejercicio 16

Clase AuthorityService ---------------------- Este servicio proporciona operaciones de alto nivel para gestionar las autoridades (roles o permisos) de los usuarios. Funcionalidades: - Agregar o actualizar una autoridad para un usuario. - Eliminar una autoridad para un usuario. - Obtener una autoridad por el nombre de usuario. - Eliminar una autoridad usando un objeto Authority. Utiliza transacciones con la anotación @Transactional para asegurar que las operaciones de escritura sean consistentes.

Vistas JSP

Ejercicio 17

Crear una vista para el inicio de sesión. La vista debe mostrar un formulario donde el usuario puede ingresar su nombre de usuario y contraseña. Además, deben mostrarse los mensajes de éxito o error si existen en la sesión. También se deben incluir enlaces para crear una cuenta nueva o cambiar la contraseña en caso de que el usuario no tenga una cuenta o quiera actualizar su contraseña.

Imagen del programa
Vista de login
Ejercicio 18

Crear una vista para el panel de administración de usuarios que muestre dos secciones: una para administradores (ADMIN) y otra para usuarios (USER). La vista debe incluir un formulario para cerrar sesión, mostrar el nombre y rol del usuario autenticado, y mostrar mensajes de éxito o error. Los administradores pueden ver una tabla con información de otros administradores (nombre, contraseña truncada y estado de la cuenta). Los usuarios pueden ver una tabla similar con su propia información, con enlaces para acceder a detalles adicionales. Solo los usuarios con rol ADMIN pueden ver la sección de administradores.

Imagen del programa
Panel de usuarios
Ejercicio 19

Esta vista está diseñada para la página de administradores de la aplicación. Permite visualizar el nombre de usuario autenticado y su nivel de rol. Muestra mensajes de éxito o error si están disponibles en la sesión. Además, proporciona un formulario para cerrar sesión y un enlace para regresar a la página de inicio. La página incluye protección CSRF y un diseño estilizado a través de la hoja de estilos vinculada.

Imagen del programa
Vista de admin
Ejercicio 20

Esta vista muestra la página para los usuarios autenticados. Permite visualizar el nombre y nivel del usuario autenticado, mostrando también mensajes de éxito o error si están disponibles en la sesión. Incluye un formulario para cerrar sesión con protección CSRF y un enlace para regresar a la página de inicio. El diseño está estilizado con una hoja de estilos vinculada.

Imagen del programa
Vista de user
Ejercicio 21

Esta vista permite la gestión de usuarios. Muestra mensajes de éxito o error si están disponibles en la sesión. Además, incluye formularios para activar o borrar usuarios. Los campos de usuario y contraseña son de solo lectura y se incluyen acciones de protección CSRF para seguridad. Los botones permiten activar a los usuarios desactivados o eliminar usuarios. Todo el diseño está estilizado con una hoja de estilos vinculada.

Imagen del programa
Activar/Desactivar usuarios
Ejercicio 22

Enunciado: Esta vista permite la creación de una cuenta de usuario. Muestra un formulario donde el usuario puede ingresar su nombre de usuario, contraseña y confirmar la contraseña. También incluye mensajes de éxito o error si están disponibles en la sesión y tiene protección CSRF para evitar ataques. Además, ofrece un enlace para que los usuarios que ya tienen una cuenta puedan iniciar sesión.

Imagen del programa
Crear cuenta usuario
Ejercicio 23

Esta vista permite al usuario cambiar su contraseña. Ofrece un formulario donde se debe ingresar el nombre de usuario, la contraseña actual, la nueva contraseña y su confirmación. Además, incluye un formulario para cerrar sesión y volver a la página de login. Los mensajes de éxito o error se muestran si están disponibles en la sesión. Todos los formularios están protegidos contra ataques CSRF.

Imagen del programa
Cambiar password
Ejercicio 24

Esta vista se muestra cuando el usuario intenta acceder a una página o recurso para el cual no tiene permisos. Se muestra un mensaje de error 403 indicando que el acceso ha sido denegado, y un enlace para redirigir al usuario de vuelta a la página de inicio.