1
resposta

[Dúvida] Conflito com CORS

Estou fazendo a conexão front/back em um projeto pessoal e o seguinte erro surge:

Access to XMLHttpRequest at 'http://localhost:8080/usuarios' from origin 'http://localhost:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Ou seja, está acontecendo um problema de comunicação entre o front(5173) e o back(8080) , o erro de CORS não era pra estar acontecendo já que o @CrossOrigin está configurado nas entidades corretamente.

Estou usando SpringBoot achando que o problema está no SecurityConfig... Segue abaixo o código:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
 
 @Autowired
 private SecurityFilter securityFilter;
 
 @Bean
 public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
     http .csrf(csrf -> csrf.disable())
       .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
             .authorizeHttpRequests(req -> {
                 req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                 req.requestMatchers(HttpMethod.POST, "/usuarios").permitAll();
                 req.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();
 }

O erro pode ser no SecurityConfig que esta gerando isso? Qual configuração deve ser feita no spring 3.1 para que esse erro de Cors não ocorra?

PS: O erro esta ocorrendo apenas quando vai pro front , pois no postman os metodos estão retornando normalmente.

1 resposta

Olá, Bruno!

Para resolver esse problema, você pode configurar o Spring Boot para permitir as requisições do domínio do front-end. No seu código, você já está usando a anotação @CrossOrigin nas entidades, mas isso não é suficiente para resolver o problema de CORS em todas as requisições.

Uma opção é adicionar a configuração do CORS no método securityFilterChain da classe SecurityConfig. Você pode fazer isso utilizando o método cors() do objeto HttpSecurity. Por exemplo:

.http.cors()

Além disso, você pode especificar quais origens são permitidas utilizando o método allowedOrigins(). Por exemplo, se você quiser permitir requisições apenas do domínio "http://localhost:5173", você pode fazer assim:

.http.cors().configurationSource(request -> {
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowedOrigins(Arrays.asList("http://localhost:5173"));
    config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
    return config;
})

Dessa forma, o Spring Boot vai adicionar o cabeçalho Access-Control-Allow-Origin com o valor "http://localhost:5173" nas respostas do back-end, permitindo assim que o front-end faça as requisições.

Espero ter ajudado e bons estudos!