Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

Haga lo que hicimos: Autorización de requests

////

@Component
public class SecurityFilter extends OncePerRequestFilter {

private static final Logger logger = LoggerFactory.getLogger(SecurityFilter.class);
private static final String BEARER_PREFIX = "Bearer ";

@Autowired
private UsuarioRepository repository;

@Autowired
private TokenService tokenService;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    try {
        var tokenJWT = recuperarToken(request);
        if (tokenJWT != null) {
            var subject = tokenService.getSubject(tokenJWT);
            var usuario = repository.findByLogin(subject);

            if (usuario == null) {
                logger.warn("No se encontro usuario para el subject JWT '{}'.", subject);
                SecurityContextHolder.clearContext();
            } else {
                var authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
    } catch (RuntimeException exception) {
        SecurityContextHolder.clearContext();
        logger.warn("Error autenticando request {} {}: {}", request.getMethod(), request.getRequestURI(), exception.getMessage());
    }

    filterChain.doFilter(request, response);
}

private String recuperarToken(HttpServletRequest request) {
    var authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
    if (!StringUtils.hasText(authorizationHeader)) {
        return null;
    }
    if (!authorizationHeader.regionMatches(true, 0, BEARER_PREFIX, 0, BEARER_PREFIX.length())) {
        return null;
    }

    var token = authorizationHeader.substring(BEARER_PREFIX.length()).trim();
    return StringUtils.hasText(token) ? token : null;
}

}

////

1 respuesta
solución!

Hola Jhon, espero que estés bien

Parece que estás trabajando en la implementación de un filtro de seguridad para la autorización de solicitudes en tu API utilizando Spring Boot. El código que compartiste se ve bien en general, pero aquí hay algunos puntos que podrías considerar para asegurarte de que todo esté funcionando correctamente:

  1. Verificación del Token JWT: Asegúrate de que el método tokenService.getSubject(tokenJWT) esté correctamente implementado para extraer el subject del token JWT. Esto es crucial para identificar al usuario asociado al token.

  2. Manejo de Excepciones: Estás capturando RuntimeException en el bloque try-catch. Considera si hay excepciones más específicas que podrías manejar para tener un control más preciso sobre los errores que pueden ocurrir durante la autenticación.

  3. Clear Context: Estás usando SecurityContextHolder.clearContext() en caso de un error o si no se encuentra el usuario. Esto es correcto, pero asegúrate de que esta acción se realice solo cuando sea necesario, para no limpiar el contexto de seguridad por error.

  4. Log de Advertencias: Los mensajes de advertencia que estás registrando son útiles para el diagnóstico. Asegúrate de que el logger esté configurado adecuadamente para capturar estos mensajes en tu entorno de producción o desarrollo.

  5. Pruebas: Asegúrate de probar tu implementación con diferentes escenarios, como solicitudes con y sin el encabezado de autorización, tokens válidos e inválidos, etc.

Si todo está configurado correctamente, tu filtro debería manejar la autorización de solicitudes de manera efectiva.

Espero haber ayudado y buenos estudios!