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

Cors e JWT

Olá gente! estou com uma certa dificuldade de integrar backend com frontend. Até antes de implementar JWT, eu conseguia fazer requisições tranquilo mas depois que terminei o curso e conseguir fazer as resquisições no postman e insomnia, na aplicação da erro "cess to XMLHttpRequest at 'http://localhost:8080/login' from origin 'http://localhost:3000' 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."

meu securityConfigurations

package br.com.alura.challenger.config;

import org.apache.catalina.authenticator.SpnegoAuthenticator.AuthenticateAction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
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;

@Configuration
@EnableWebSecurity
public class securityConfigurations {
    @Autowired
    private SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        return http.cors().and().csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().authorizeRequests()
                .antMatchers(HttpMethod.POST, "/login").permitAll()
                .anyRequest().authenticated().and()                
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {

        return configuration.getAuthenticationManager();
    }

    @Bean 
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

alguem ja teve este problema ou sabe como poderia solucionar ?

2 respostas
solução!

Olá Pedro, tudo bem?

Esse erro ocorre porque o navegador está bloqueando as requisições do seu frontend para o backend devido à política de segurança CORS. Essa política impede que um site acesse recursos de outro site que esteja em um domínio diferente.

O CORS é um mecanismo de segurança implementado pelos navegadores para proteger os usuários, restringindo as solicitações HTTP feitas a partir de um determinado domínio a outro domínio. Nesse caso, o navegador está bloqueando a solicitação feita a partir do domínio 'http://localhost:3000' para o domínio 'http://localhost:8080' por falta do cabeçalho 'Access-Control-Allow-Origin' na resposta do servidor.

Para resolver esse problema, você pode adicionar a configuração adequada para permitir as solicitações CORS no seu backend. No Spring Security, isso pode ser feito configurando o filtro CorsFilter.

Aqui está um exemplo de como você pode configurar o filtro CorsFilter no Spring Security:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("http://localhost:3000"); // Domínio do seu frontend
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

Essa configuração permitirá que as solicitações do domínio 'http://localhost:3000' sejam aceitas pelo servidor. Certifique-se de substituir 'http://localhost:3000' pelo domínio correto do seu frontend.

Lembre-se de adicionar a anotação @EnableWebSecurity na classe de configuração do Spring Security para garantir que a configuração do filtro CorsFilter seja carregada corretamente.

Com essa configuração, o cabeçalho 'Access-Control-Allow-Origin' será adicionado à resposta do servidor, permitindo que as solicitações CORS sejam realizadas com sucesso.

Espero que isso resolva o seu problema de política de CORS. Se você tiver mais dúvidas, fique à vontade para perguntar!

Obrigado Otávio, funcionou!