Filter
@Component
public class TokenFilter extends OncePerRequestFilter{
@Autowired
private TokenService tokenService;
@Autowired
private UserRepository userRepository;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
var token = recoverToken(request);
UserEntity user = null;
if (token == null) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // Define o status de resposta como 401 (Unauthorized)
response.getWriter().write("Token não fornecido"); // Envia uma mensagem de erro ao cliente
return;
}
if(token != null) {
String subjetc = tokenService.getSubject(token);
user = userRepository.findByEmail(subjetc);
if(user != null) {
var authentication = new UsernamePasswordAuthenticationToken(user, user.getId(), user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
UserEntity userEntity = userRepository.findByEmail(subjetc);
var authentication = new UsernamePasswordAuthenticationToken(userEntity, userEntity.getId(), userEntity.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
public String recoverToken(HttpServletRequest request) {
String authorizationHeader = request.getHeader("Authorization");
if(authorizationHeader != null) {
return authorizationHeader.replace("Bearer ", "");
}
return null;
}
}Configuração
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(csrf -> csrf.disable())
.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(req ->{
req.requestMatchers(HttpMethod.POST, "/users/login").permitAll();
req.requestMatchers(HttpMethod.POST, "/users/cadastro").permitAll();
req.requestMatchers(HttpMethod.GET, "/h2-console/**").permitAll();
req.anyRequest().permitAll();
})
.addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class)
.build();
} queria permitir que /users/login e /users/cadastro podessem ser acessados sem token, também queria saber se a maneira que lancei a exceção quando o token é null está certo. Se alguem puder me ajudar :)