{"id":15042765,"url":"https://github.com/danielpraisethelord/backend-users-spring-security-jwt","last_synced_at":"2026-03-17T23:34:34.439Z","repository":{"id":252333183,"uuid":"840125691","full_name":"danielpraisethelord/Backend-Users-Spring-Security-JWT","owner":"danielpraisethelord","description":"El proyecto implementa una capa de seguridad que se basa en JWT (JSON Web Tokens) y Spring Security.","archived":false,"fork":false,"pushed_at":"2024-08-09T03:06:02.000Z","size":42,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-13T17:26:33.476Z","etag":null,"topics":["backend-api","java","java-8","jwt","jwt-authentication","jwt-token","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielpraisethelord.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-09T03:03:53.000Z","updated_at":"2024-08-09T03:07:58.000Z","dependencies_parsed_at":"2024-08-09T04:24:06.663Z","dependency_job_id":"9ee510cc-9ddd-4fbd-a51c-c4ddd1cd7eb8","html_url":"https://github.com/danielpraisethelord/Backend-Users-Spring-Security-JWT","commit_stats":null,"previous_names":["danielpraisethelord/backend-users-spring-security-jwt"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpraisethelord%2FBackend-Users-Spring-Security-JWT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpraisethelord%2FBackend-Users-Spring-Security-JWT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpraisethelord%2FBackend-Users-Spring-Security-JWT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielpraisethelord%2FBackend-Users-Spring-Security-JWT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielpraisethelord","download_url":"https://codeload.github.com/danielpraisethelord/Backend-Users-Spring-Security-JWT/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243447641,"owners_count":20292455,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend-api","java","java-8","jwt","jwt-authentication","jwt-token","spring-boot"],"created_at":"2024-09-24T20:47:57.239Z","updated_at":"2025-12-30T00:03:25.162Z","avatar_url":"https://github.com/danielpraisethelord.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Documentación de Seguridad del Proyecto: Spring Boot con JWT\n\nEste documento cubre todos los aspectos relacionados con la seguridad del proyecto, centrado en el uso de Spring Security, JWT, y varias bibliotecas clave como `jakarta`, `jsonwebtoken`, y `jackson`.\n\n## 1. Introducción a la Seguridad en la Aplicación\nEl proyecto implementa una capa de seguridad que se basa en JWT (JSON Web Tokens) y Spring Security. La seguridad de la aplicación se asegura mediante la autenticación de usuarios y la autorización de sus roles para acceder a ciertos endpoints. Los JWT se utilizan como mecanismo para transportar las credenciales del usuario en cada solicitud al servidor después de la autenticación inicial.\n\n## 2. Explicación de Clases y Componentes de Seguridad\n\n### 2.1. User\n**Archivo:** `User.java`\n\n**Descripción:** Esta clase representa a un usuario en el sistema. Es una entidad que se almacena en la base de datos y contiene información relevante como nombre de usuario, contraseña, y roles asignados.\n\n**Anotaciones Importantes:**\n- `@Entity`: Marca la clase como una entidad de JPA que se corresponde con una tabla en la base de datos.\n- `@Table(name = \"users\")`: Especifica la tabla en la base de datos que almacena los datos del usuario.\n- `@Id`: Indica la clave primaria de la entidad.\n- `@ManyToMany(fetch = FetchType.EAGER)`: Define una relación muchos a muchos entre los usuarios y los roles, con carga inmediata de los roles cuando se carga un usuario.\n\n**Propósito:** La clase `User` es fundamental para la autenticación y autorización de la aplicación. Contiene los datos de los usuarios que se validarán contra las credenciales suministradas durante el inicio de sesión.\n\n### 2.2. Role\n**Archivo:** `Role.java`\n\n**Descripción:** La clase `Role` representa un rol de usuario en el sistema, como `ADMIN` o `USER`. Estos roles determinan los permisos que tiene un usuario dentro de la aplicación.\n\n**Anotaciones Importantes:**\n- `@Entity`: Similar a la clase `User`, `Role` es una entidad JPA.\n- `@Table(name = \"roles\")`: Define la tabla de la base de datos que almacena los roles.\n- `@Id`: Marca la clave primaria de la entidad.\n\n**Propósito:** Los roles son esenciales para la autorización. A cada usuario se le asigna uno o más roles que determinan su acceso a diferentes partes de la aplicación.\n\n### 2.3. UserRepository\n**Archivo:** `UserRepository.java`\n\n**Descripción:** Esta interfaz extiende `JpaRepository\u003cUser, Long\u003e` y proporciona métodos CRUD para manejar la entidad `User`.\n\n**Métodos Clave:**\n- `Optional\u003cUser\u003e findByUsername(String username)`: Este método se utiliza para encontrar un usuario por su nombre de usuario. Es crucial para la autenticación.\n\n**Propósito:** `UserRepository` es utilizado por los servicios de Spring Security para cargar los detalles de un usuario, específicamente durante la autenticación.\n\n### 2.4. RoleRepository\n**Archivo:** `RoleRepository.java`\n\n**Descripción:** Similar a `UserRepository`, `RoleRepository` extiende `JpaRepository\u003cRole, Long\u003e` y proporciona métodos para interactuar con la entidad `Role`.\n\n**Propósito:** Es utilizado para manejar los roles en la base de datos, especialmente durante la asignación de roles a los usuarios.\n\n### 2.5. UserController\n**Archivo:** `UserController.java`\n\n**Descripción:** Este controlador gestiona las solicitudes relacionadas con los usuarios.\n\n**EndPoints Importantes:**\n- `@PostMapping(\"/login\")`: Maneja la autenticación de usuarios y la generación de JWT.\n- `@PostMapping(\"/register\")`: Permite registrar nuevos usuarios en la base de datos.\n\n**Propósito:** `UserController` expone los endpoints públicos para el registro de nuevos usuarios y el inicio de sesión, que son fundamentales para la autenticación y la emisión de JWT.\n\n## 2.6. Seguridad: Configuración y Filtros\n\n### 2.6.1. JwtConfig\n**Archivo:** `JwtConfig.java`\n\n**Descripción:** Esta clase contiene la configuración del JWT, como el secreto utilizado para firmar los tokens, la expiración del token, y la cabecera donde se espera encontrar el token.\n\n**Propiedades Importantes:**\n- `private String secretKey`: Clave secreta para firmar los JWT.\n- `private long validityInMilliseconds`: Duración de la validez del token.\n\n**Propósito:** `JwtConfig` proporciona todos los parámetros necesarios para la creación y validación de JWT en la aplicación.\n\n### 2.6.2. SecurityConfig\n**Archivo:** `SecurityConfig.java`\n\n**Descripción:** Configura la seguridad de la aplicación usando Spring Security. Define qué rutas están protegidas y cuáles son públicas, además de establecer la configuración del manejo de JWT.\n\n**Configuraciones Importantes:**\n- `@Override protected void configure(HttpSecurity http)`: Configura la seguridad de HTTP, definiendo qué endpoints están protegidos y cuáles no.\n- `http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)`: Añade el filtro de autenticación JWT antes del filtro estándar de autenticación de usuario y contraseña.\n\n**Propósito:** `SecurityConfig` es el núcleo de la configuración de seguridad. Controla cómo se manejan las solicitudes, qué usuarios pueden acceder a qué rutas, y cómo se validan los tokens JWT.\n\n### 2.6.3. JwtAuthenticationFilter\n**Archivo:** `JwtAuthenticationFilter.java`\n\n**Descripción:** Este filtro maneja la autenticación inicial de los usuarios. Si las credenciales son correctas, genera un JWT y lo envía en la respuesta.\n\n**Métodos Clave:**\n- `@Override protected void successfulAuthentication(...)`: Genera el JWT tras una autenticación exitosa y lo incluye en la cabecera de la respuesta.\n\n**Propósito:** Proporciona el mecanismo para crear y enviar el JWT una vez que el usuario se ha autenticado correctamente.\n\n### 2.6.4. JwtValidationFilter\n**Archivo:** `JwtValidationFilter.java`\n\n**Descripción:** Este filtro se ejecuta para cada solicitud protegida. Extrae el JWT de la cabecera de la solicitud, lo valida, y si es válido, configura el contexto de seguridad para que Spring Security lo maneje.\n\n**Métodos Clave:**\n- `@Override protected void doFilterInternal(...)`: Se encarga de la validación del JWT y de la configuración del contexto de seguridad.\n\n**Propósito:** `JwtValidationFilter` asegura que cada solicitud que llegue a un endpoint protegido esté acompañada de un JWT válido.\n\n## 2.7. JpaUserDetailsService\n**Archivo:** `JpaUserDetailsService.java`\n\n**Descripción:** Este servicio implementa `UserDetailsService` de Spring Security, que se utiliza para cargar los detalles del usuario desde la base de datos durante la autenticación.\n\n**Métodos Clave:**\n- `@Override public UserDetails loadUserByUsername(String username)`: Carga un usuario por su nombre de usuario y construye un objeto `UserDetails` con sus roles.\n\n**Propósito:** Es el puente entre la base de datos y Spring Security. `JpaUserDetailsService` carga los detalles del usuario que Spring Security necesita para autenticarse y autorizar.\n\n## 3. Funcionamiento del JWT en la Aplicación\n\n### 3.1. Creación de JWT\nEl JWT se crea durante el proceso de autenticación. Cuando un usuario envía su nombre de usuario y contraseña al endpoint de login, `JwtAuthenticationFilter` valida las credenciales. Si son correctas, el filtro genera un JWT utilizando `JwtConfig` y lo devuelve al usuario en la respuesta. Este token contiene información codificada como el nombre de usuario y roles del usuario, firmado digitalmente con la clave secreta definida en `JwtConfig`.\n\n### 3.2. Uso del JWT para Acceder a Endpoints Protegidos\nPara acceder a cualquier endpoint protegido por la seguridad de Spring, el usuario debe enviar el JWT en la cabecera de la solicitud bajo `Authorization`. `JwtValidationFilter` intercepta las solicitudes, extrae el token, y lo valida. Si el token es válido, configura el contexto de seguridad con los detalles del usuario, permitiendo que Spring Security gestione la solicitud como si el usuario estuviera autenticado.\n\n### 3.3. Expiración y Renovación del JWT\nEl token JWT tiene una duración limitada, configurada en `JwtConfig`. Si un token ha expirado, el usuario debe autenticarse nuevamente para obtener uno nuevo. Esta estrategia protege contra el uso no autorizado de tokens antiguos.\n\n## 4. Conclusión\nEl sistema de seguridad basado en JWT implementado en esta aplicación es un enfoque robusto para autenticar y autorizar a los usuarios. Utiliza Spring Security junto con JWT para asegurar que sólo los usuarios autenticados y autorizados puedan acceder a recursos sensibles. Las configuraciones y clases discutidas trabajan en conjunto para proporcionar una capa de seguridad que protege la aplicación contra accesos no autorizados, asegurando que todas las solicitudes sean verificadas antes de ser procesadas.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielpraisethelord%2Fbackend-users-spring-security-jwt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielpraisethelord%2Fbackend-users-spring-security-jwt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielpraisethelord%2Fbackend-users-spring-security-jwt/lists"}