Introducción

1

Protección de aplicaciones con Spring Security

2

Configuración de Spring Security: Autorización y Autenticación

3

Configuración de Spring Security en Proyectos Java con Gradle

4

Autenticación Básica con Spring Security por Defecto

Configuración de seguridad

5

Configuración de Seguridad con Spring Security y Basic Authentication

6

Funcionamiento del Basic Authentication Filter en Spring Security

7

Deshabilitar protección CSRF en APIs REST con Spring Security

8

Configuración de CORS en Spring Security para APIs y Frontend

9

Configuración de Reglas de Acceso en Spring Security

10

Creación de usuarios personalizados en Spring Security

11

Creación y Gestión de Roles y Permisos en Aplicaciones Web

Autenticación con BD

12

Creación y Gestión de Usuarios en Base de Datos con Spring Security

13

Implementación de User Detail Service en Spring Security con MySQL

14

Asignación de Roles y Permisos en Spring Security

15

Permisos Específicos con Authorities en Spring Security

16

Seguridad de Métodos en Spring Security: Control de Accesos por Roles

Seguridad con JWT

17

Creación y Uso de JSON Web Tokens en Java con Auth0

18

Implementación de Autenticación con JSON Web Tokens en Spring Boot

19

Validación de JSON Web Tokens con Auth0 en Java

20

Creación de Filtro de Seguridad JWT en Spring Security

21

Implementación de JSON Web Token en Spring Security

Próximos pasos

22

Auditoría de Usuarios con Spring Security y Data JPA

23

Configuración y Personalización de Spring Security

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Implementación de JSON Web Token en Spring Security

21/23
Recursos

¿Cómo se integra un filtro JWT en Spring Security?

La integración de un filtro JWT dentro de Spring Security es una tarea fundamental para asegurar que nuestras aplicaciones manejen la autenticación de manera segura y libre de sesiones de estado. El fin es que las peticiones sean validadas usando un JSON Web Token, lo cual se logra extendiendo la configuración de seguridad estándar.

¿Cómo se configura SecurityConfig para usar JWT?

En primer lugar, es esencial ajustar la clase SecurityConfig para dejar de utilizar la autenticación básica HTTP y comenzar a usar la basada en JWT. Esto implica varias etapas:

  • Inyección del filtro JWT: Se debe inyectar el filtro, DebateFinalJWTFilter, dentro del constructor de la clase SecurityConfig utilizando @Autowired.

  • Reemplazo de HTTP Basic: En el método de configuración de seguridad, se reemplaza la última línea de autenticación básica por la adición del nuevo filtro JWT con addFilter.

¿Por qué es importante incluir el filtro antes de otros filtros?

Cuando se decide agregar un filtro personal dentro de una aplicación Spring Security, es crucial determinar su lugar en la cadena de filtros. Para el caso de un filtro JWT:

  • Posicionamiento del filtro: El filtro JWT debe incluirse antes de BasicAuthenticationFilter o incluso UsernamePasswordAuthenticationFilter, ya que es considerado un perfil estándar para asegurar la autenticación inicial en Spring.

¿Qué significa tener una aplicación stateless?

Una aplicación stateless no almacena ninguna información sobre las sesiones del usuario entre las peticiones. Este enfoque, ideal para JWT, se consigue de la siguiente manera:

  • Configuración de la política de sesiones: Dentro de SecurityConfig, establecer SessionCreationPolicy.STATELESS indica que la aplicación no mantendrá estado de sesión y que cada petición deberá ser autenticada de forma independiente.

¿Cómo se realiza la verificación de los detalles del usuario con JWT?

La correcta implementación de JWT no solo garantiza el paso seguro de peticiones, sino que también permite verificación detallada de las mismas:

¿Cómo carga el contexto de seguridad?

La carga adecuada del contexto de seguridad es primordial:

  • Incluir detalles de autenticación: Antes de añadir la autenticación al contexto de seguridad, se añaden detalles relevantes usando setDetails() en el AuthenticationToken.

  • Uso de WebAuthenticationDetailsSource: Se emplea para construir detalles extra, como la dirección IP remota y evitar el uso de una sesión debido al enfoque stateless.

¿Cómo se evalúan las peticiones en consola?

Una vez configurada la seguridad:

  • Validación de peticiones JWT: Usando Postman, primero se inicia sesión para obtener un JWT. Al realizar una petición con el token, se verifica su validez, garantizando un flujo seguro excluyendo el uso de credenciales básicas.

  • Manejo de peticiones con token manipulado: En caso de alterar el contenido del token (como el sub cambiando de admin a customer), el servidor responde con un 403, demostrando que el token fue manipulado y su firma no es válida.

Mediante una gestión adecuada de la configuración de Spring Security con JWT, se asegura que la aplicación no solo sea segura, sino también eficiente y libre de extensos manejos de sesión. Este proceso fortalece la capacidad de autenticación y autorización, indispensable para aplicaciones modernas y seguras.

Aportes 9

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Este método está deprecado

sessionManagement()

En su lugar se puede utilizar de la siguiente manera

.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))

Que laaaargo es implementar jwt

Es la segunda vez que veo el curso, he entendido mucho más, gracias profe Alejandro.
es comun tener ambas autenticaciones? @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) .cors(Customizer.withDefaults()) .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authorize -> authorize .requestMatchers(HttpMethod.POST, "/client/createAccount").permitAll() .anyRequest() .authenticated() ) .httpBasic(withDefaults()) .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); }
Creo que se pudo profundizar más todo esto, intentare empezar de nuevo ya que me es difícil no querer simplemente memorizar el código, seguí el paso a paso y al final todo me da 403 aunque pase el jwt.
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) .cors(Customizer.withDefaults()) .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(authorize -> authorize .requestMatchers(HttpMethod.POST, "/client/createAccount").permitAll() .anyRequest() .authenticated() ) .httpBasic(withDefaults()) .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); }
Tengo una duda y es referente al filtro JWT. Cuando utilizo el login en teoría no debería utilizar o pasar este filtro verdad ? Es que en mi aplicación no da respuesta a la petición post del login, me da respuesta 403 es como si entrara en la primera validación, como el header de autorización es nulo, entra en este método y retorna un 403. Me podrían orientar, gracias
buenas gente, alguno me ayuda, al hacer la solicitud a clientes me sale este erro por consola y no logro identificarlo "2024-03-15T20:31:59.574-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.security.web.FilterChainProxy : Securing GET /api/customers/customer/192758012 2024-03-15T20:31:59.574-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext 2024-03-15T20:31:59.574-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.s.w.session.SessionManagementFilter : Request requested invalid session id 806AE7799DEA7BDA9CFA5732C16B39DF 2024-03-15T20:31:59.576-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.s.w.a.Http403ForbiddenEntryPoint : Pre-authenticated entry point called. Rejecting access 2024-03-15T20:31:59.579-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.security.web.FilterChainProxy : Securing GET /error 2024-03-15T20:31:59.582-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to anonymous SecurityContext 2024-03-15T20:31:59.582-03:00 DEBUG 17024 --- \[nio-8080-exec-5] o.s.s.w.a.Http403ForbiddenEntryPoint : Pre-authenticated entry point called. Rejecting access "