Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Problema de compilação

Estou com problemas nos @Override, não estão deixando compilar o pgm.

private final AuthenticationManager authenticationManager;
private final JwtUtil jwtUtil;

public JwtAuthenticationFilter(AuthenticationManager authenticationManager, JwtUtil jwtUtil) {
    this.authenticationManager = authenticationManager;
    this.jwtUtil = jwtUtil;
}

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    try {
        AuthenticationRequest authRequest = new ObjectMapper().readValue(request.getInputStream(), AuthenticationRequest.class);
        return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword(), new ArrayList<>()));
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
    UserDetailsImpl userDetails = (UserDetailsImpl) authResult.getPrincipal();
    String token = jwtUtil.generateToken(userDetails);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(new ObjectMapper().writeValueAsString(new AuthenticationResponse(token)));
    response.getWriter().flush();
}

}

2 respostas

Parece que você está tentando usar anotações @Override em métodos que estão em uma classe que não está herdando de nenhuma classe base. No Java, a anotação @Override é usada para indicar que um método está substituindo um método na classe pai, o que é obrigatório apenas se você estiver sobrescrevendo métodos de uma classe base.

No seu código, você está implementando métodos de interfaces ou extendendo de classes abstratas que definem esses métodos. Aqui está uma estrutura básica de como isso poderia estar organizado: import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsServiceImpl; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList;

public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

private final AuthenticationManager authenticationManager;
private final JwtUtil jwtUtil;

public JwtAuthenticationFilter(AuthenticationManager authenticationManager, JwtUtil jwtUtil) {
    this.authenticationManager = authenticationManager;
    this.jwtUtil = jwtUtil;
}

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    try {
        AuthenticationRequest authRequest = new ObjectMapper().readValue(request.getInputStream(), AuthenticationRequest.class);
        return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword(), new ArrayList<>()));
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
    UserDetails userDetails = (UserDetails) authResult.getPrincipal();
    String token = jwtUtil.generateToken(userDetails);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write(new ObjectMapper().writeValueAsString(new AuthenticationResponse(token)));
    response.getWriter().flush();
}

}

algumas observações:

Herança da Classe Base: JwtAuthenticationFilter agora estende UsernamePasswordAuthenticationFilter, que é uma classe fornecida pelo Spring Security para facilitar a autenticação com base em nome de usuário e senha.

Métodos Sobrescritos: Os métodos attemptAuthentication e successfulAuthentication agora estão sobrescrevendo métodos definidos na classe UsernamePasswordAuthenticationFilter.

Remoção de UserDetailsImpl: No método successfulAuthentication, substituí UserDetailsImpl por UserDetails, que é a interface genérica para classes de detalhes do usuário no Spring Security.

Certifique-se de que sua classe JwtAuthenticationFilter está corretamente configurada para estender ou implementar as classes ou interfaces corretas que definem os métodos que você deseja sobrescrever. Isso deve resolver os problemas de compilação relacionados às anotações @Override.

solução!

Olá Mauricio Junior, refiz o código conforme você explicou e mesmo assim não está funcionando, agradeço pela ajuda.