1
resposta

[Dúvida] como remover o erro de cors na api stateless

estou tentando conectar a tela de login feito em react CRA quando eu envio a requisicao está apresentando erro de cors ao trazer a resposta`` Filtro

package br.com.IBMsystem.IBMsystem.Security;

import br.com.IBMsystem.IBMsystem.Repository.UsuarioRepository;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;
@Configuration
public class SecurityFilter extends OncePerRequestFilter {
    @Autowired
    private UsuarioRepository usuarioRepository;
    @Autowired
    private GerandoToken gerandoToken;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
          var token = pegarToken(request);
        System.out.println("token"+token);
        System.out.println(request);
          if(token!=null){
              var auth = gerandoToken.convertendoConde(token);
              System.out.println(auth);
              var result = usuarioRepository.findByEmail(auth);
              var aut = new UsernamePasswordAuthenticationToken(result, null, result.getAuthorities());
              SecurityContextHolder.getContext().setAuthentication(aut);
          }
        System.out.println("erro");
          filterChain.doFilter(request, response);
    }

    private String pegarToken(HttpServletRequest request) {
        var authoraze = request.getHeader("Authorization");
        if(authoraze!=null){
            return  authoraze.replace("Bearer","").trim();
        }
        return null;
    }
}
classe de consfiguracao do spring security
classe de consfiguracao do spring security
package br.com.IBMsystem.IBMsystem.Security;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@EnableWebSecurity
@Configuration
public class SecurityConfigurations {
    @Autowired
    private SecurityFilter securityFilter;


    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(e->e.disable())
                .sessionManagement(e->e.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(e->e.requestMatchers(HttpMethod.POST,"/login").permitAll()
                        .anyRequest().authenticated()
                )
                .addFilterBefore(securityFilter,UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }
    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }


}
class de configuracao de cors
@Configuration
public class CorsConfigurations implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS",  "HEAD", "TRACE", "CONNECT");
    }
}

alguem pode me da essa força ,versao do spring boot3.1.5

1 resposta

Vou te dar uma força.

Primeiro, bora dar uma olhada na sua classe de configuração do CORS. Parece que tá tudo certo lá, liberando os métodos e permitindo a origem do localhost:3000. Beleza até aqui.

Agora, dá uma olhada no seu filtro de segurança. Tá tudo rodando no mesmo projeto? Às vezes, o Spring Security e o CORS podem dar uma complicada se não estiverem na mesma página.

Outra coisa, vê se tá chegando o header "Authorization" na requisição. Às vezes, o front pode não estar mandando direito. A função pegarToken parece estar cuidando disso, mas é sempre bom dar uma conferida.

Ah, e no front, confere se a requisição tá com o header certo, tipo assim:

headers: {
  'Authorization': 'Bearer TOKENAQUI'
}

Por fim, já tentou adicionar o CORS no filtro também? Às vezes, o Spring Security e o CORS não estão se entendendo muito bem, e é bom dar uma forçada.

Aí, tenta de novo e vê se resolve. Se continuar na treta, dá um grito aqui que a gente tenta desenrolar mais isso.