Estou enfrentando um problema em um projeto de estudos. Ao lidar com requisições para um Controller não mapeado, o sistema está retornando um código de status 403 - Forbidden, em vez de 404 ou Bad Request, como é o esperado.
Ao habilitar o logging do Spring Security, identifiquei que o erro ocorre no método doFilter(). Gostaria de saber como posso prevenir esse comportamento indesejado e aplicar boas práticas nesse contexto.
Além disso, observei que, em um cenário específico (Caso 2), quando é enviado um Bearer token e o sistema faz uma consulta no banco para verificar a autenticidade, a rota nem mesmo existe, e o sistema não verifica se a rota está mapeada antes de tentar autenticar. Isso para mim é errado e não deveria ocorrer?
Você pode encontrar o código-fonte relevante neste repositório: https://github.com/team-off-app/team-off-api. A classe SecurityFilter está em com/teamoff/api/infra/security/SecurityFilter.java
Aqui está a implementação da classe SecurityFilter, seguida pelos logs da aplicação:
@Component
public class SecurityFilter extends OncePerRequestFilter {
private final TokenService tokenService;
private final AuthRepository authRepository;
public SecurityFilter(TokenService tokenService, AuthRepository authRepository) {
this.tokenService = tokenService;
this.authRepository = authRepository;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String tokenJWT = getToken(request);
if (tokenJWT != null) {
String authID = tokenService.getClaim(tokenJWT, "auth_id");
Auth auth = authRepository.findAuthById(UUID.fromString(authID));
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(auth, null, auth.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
private String getToken(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null) {
return authHeader.replace("Bearer ", "");
}
return null;
}
}
Logs do Caso 1 (Requisição para endpoint não mapeado /api/events, sem Bearer Token): Logs - Caso 1
Logs do Caso 2 (Requisição para endpoint não mapeado /api/events, com Bearer Token): Logs - Caso 2
Agradeço antecipadamente pela ajuda!