Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Haga lo que hicimos: Autorización de requests

Se crea una clase de Filter, responsable de interceptar solicitudes y realizar el proceso de autenticación y autorización:

@Component
public class SecurityFilter extends OncePerRequestFilter {

@Autowired
private UsuarioRepository repository;

@Autowired
private TokenService tokenService;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    var tokenJWT = recuperarToken(request);

    if (tokenJWT != null) {
        var subject = tokenService.getSubject(tokenJWT);
        var usuario = repository.findByLogin(subject);

        var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

    filterChain.doFilter(request, response);
}

private String recuperarToken(HttpServletRequest request) {
    var authorizationHeader = request.getHeader("Authorization");
    if (authorizationHeader != null) {
        return authorizationHeader.replace("Bearer ", "");
    }

    return null;
}

}

También deberá actualizar el código de la clase SecurityConfigurations:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {

@Autowired
private SecurityFilter securityFilter;

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http.csrf(csrf -> csrf.disable())
    .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
    .authorizeHttpRequests(req -> {
        req.requestMatchers(HttpMethod.POST, "/login").permitAll();
        req.anyRequest().authenticated();
    })
    .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
    .build();
}

@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
    return configuration.getAuthenticationManager();
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

}

Y finalmente, deberá actualizar el código de la clase TokenService:

@Service
public class TokenService {

@Value("${api.security.token.secret}")
private String secret;

public String generarToken(Usuario usuario) {
    try {
        var algoritmo = Algorithm.HMAC256(secret);
        return JWT.create()
                .withIssuer("API Voll.med")
                .withSubject(usuario.getLogin())
                .withExpiresAt(fechaExpiracion())
                .sign(algoritmo);
    } catch (JWTCreationException exception){
        throw new RuntimeException("error al generar token jwt", exception);
    }
}

public String getSubject(String tokenJWT) {
    try {
        var algoritmo = Algorithm.HMAC256(secret);
        return JWT.require(algoritmo)
                .withIssuer("API Voll.med")
                .build()
                .verify(tokenJWT)
                .getSubject();
    } catch (JWTVerificationException exception) {
        throw new RuntimeException("Token JWT inválido o expirado!");
    }
}

private Instant fechaExpiracion() {
    return LocalDateTime.now().plusHours(2).toInstant(ZoneOffset.of("-03:00"));
}

}

1 respuesta

Hola Yolima,

Parece que estás trabajando en la implementación de un sistema de autenticación y autorización en tu API Rest usando Spring Boot. Lo que has compartido parece estar en el camino correcto para interceptar solicitudes y manejar la autenticación con JWT.

Aquí tienes algunas cosas que podrías revisar o considerar:

  1. Verificación del Token: Asegúrate de que el TokenService esté configurado correctamente y que el secreto utilizado para firmar y verificar los tokens sea el mismo. Esto es crucial para que la verificación del token funcione correctamente.

  2. Manejo de Errores: En el método doFilterInternal, considera agregar un manejo de errores más robusto para capturar y registrar cualquier excepción que pueda ocurrir durante la autenticación. Esto te ayudará a depurar problemas más fácilmente.

  3. Configuración de Seguridad: En la clase SecurityConfigurations, verifica que todas las rutas que deseas proteger estén correctamente configuradas. Si hay rutas adicionales que deberían estar abiertas al público, asegúrate de especificarlas.

  4. Pruebas: Una vez implementado, prueba tu configuración con diferentes escenarios: un token válido, un token inválido y sin token, para asegurarte de que el sistema se comporte como esperas.

Si todo esto está en orden y sigues teniendo problemas, podría ser útil revisar los logs del servidor para obtener más detalles sobre cualquier error que pueda estar ocurriendo.

Espero que estos consejos te sean útiles. ¡Espero haber ayudado y buenos estudios!