Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Filtro da Autenticação

Com o filtro criado e estendido da classe OncePerRequestFilter, toda requisição irá passar por ele, como mostrado na video aula, ou seja até o caminho /auth passará por ele, teria como pular os paths sem autenticação?

Bem meu caso é que gostaria de lançar um exeption caso o token não fosse valido,

Validação do Token:

public boolean isTokenValido(String authToken) {
    try {
        Jwts.parser().setSigningKey(secret).parseClaimsJws(authToken);
        return true;
    } catch (SignatureException ex) {
        //return ResponseEntity(new ErroResponseDto("Forbidden", Collections.singletonList("Invalid JWT signature")), HttpStatus.FORBIDDEN);
        logger.error("Invalid JWT signature");
        //throw new InvalidJwtAuthenticationException("Invalid JWT signature");
    } catch (MalformedJwtException ex) {
        logger.error("Invalid JWT token");
        //throw new InvalidJwtAuthenticationException("Invalid JWT token");
    } catch (ExpiredJwtException ex) {
        logger.error("Expired JWT token");
        //throw new InvalidJwtAuthenticationException("Expired JWT token");
    } catch (UnsupportedJwtException ex) {
        logger.error("Unsupported JWT token");
        //throw new InvalidJwtAuthenticationException("Unsupported JWT token");
    } catch (IllegalArgumentException ex) {
        logger.error("JWT claims string is empty.");
        //throw new InvalidJwtAuthenticationException("JWT claims string is empty.");
    }
    return false;
}

Custom Handler:

@ExceptionHandler(InvalidJwtAuthenticationException.class)
public final ResponseEntity<ErroResponseDto> handleInvalidJwtAuthenticationException(Exception e, HttpServletRequest request) {
    List<String> details = new ArrayList<>();
    details.add(e.getLocalizedMessage());
    ErroResponseDto error = new ErroResponseDto(request.getRequestURI(), "Erro Token!", details);
    return new ResponseEntity<>(error, HttpStatus.FORBIDDEN);
}
1 resposta
solução!

Oi Bruno,

Pior que esse nosso filtro precisa ser executado antes do filtro de segurança do Spring, pois se invertermos a ordem o Spring vai barrar as requisições para urls restritas, pois o usuário ainda não estará autenticado =/

Talvez o jeito então seja fazer uma validação na mão, dentro do próprio filter:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String path = request.getRequestURI();
    if (path.equals("/auth")) {
        filterChain.doFilter(request, response);
    }

    //ifs para outras urls publicas...

    //codigo para recuperar e validar token
}

Só vai ser ruim porque vai precisar verificar manualmente e se alguma url pública nova for criada na API, vai precisar ignora-la também no filter.

Mas dá para isolar as urls em uma classe separada, e chamá-la tanto do filter quanto da classe SecurityConfigurations, para evitar essa repetição.

Bons estudos!