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

@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;
}

}

@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();
}

}

@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 Alexis, espero que estés bien

Gracias por compartir tu código. Parece que estás trabajando en la implementación de un filtro de seguridad para manejar la autorización de solicitudes en tu API usando Spring Boot. Por lo que veo, has configurado un filtro personalizado SecurityFilter que verifica el token JWT y autentica al usuario si el token es válido.

Aquí hay algunos puntos que podrías revisar para asegurarte de que todo esté funcionando correctamente:

  1. Token JWT: Asegúrate de que el token JWT esté siendo generado y enviado correctamente desde el cliente. Esto incluye asegurarse de que el encabezado Authorization contenga el token en el formato correcto: Bearer <token>.

  2. Configuración del Filtro: Tu filtro SecurityFilter parece estar correctamente configurado para interceptar las solicitudes antes de que lleguen a UsernamePasswordAuthenticationFilter. Esto es importante para que el filtro pueda validar el token antes de que se procese la autenticación.

  3. Revisar Errores: Si estás obteniendo algún error, verifica los logs de la aplicación para obtener más detalles. Los errores comunes pueden estar relacionados con tokens expirados o inválidos.

  4. Pruebas: Intenta realizar pruebas con diferentes escenarios, como enviar solicitudes con y sin token, para ver cómo responde tu API. Esto te ayudará a asegurarte de que las reglas de autorización están siendo aplicadas correctamente.

Si todo está configurado como en la clase y aún enfrentas problemas, revisa si hay diferencias en tu entorno de desarrollo o en la configuración del proyecto que podrían estar afectando el comportamiento.

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