Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Configuração de cors spring security

Oi,

Após finalizar o treinamento estou tentando a comunicação com uma aplicação front end. Estou tomando o seguinte erro no console:

"Access to XMLHttpRequest at 'http://localhost:8080/usuario/cadastrar' from origin 'http://localhost:4200' 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."

Tentei uma classe de configuração, mas sem sucesso:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:4200")
                .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}

Minha classe SecurityConfigurations é:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {

    @Autowired
    private SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
                    .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                    .authorizeHttpRequests(req -> {
                        req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                        req.requestMatchers(HttpMethod.POST, "/usuario/cadastrar").permitAll();
                        req.anyRequest().authenticated();
                    })
                    .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                    .build();
    }


    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

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

}

Como posso fazer essa configuração de cors?

1 resposta
solução!

Olá Gabriel,

Pelo que você descreveu, parece que está enfrentando problemas com a política de CORS (Cross-Origin Resource Sharing) ao tentar se comunicar com sua aplicação front-end. Isso ocorre quando você tenta fazer uma requisição de um domínio (ou porta, no caso de localhost) diferente do domínio onde o back-end está rodando.

A sua classe de configuração CORS parece estar correta. No entanto, o Spring Security tem sua própria configuração de CORS que precisa ser configurada. Você pode tentar adicionar a configuração de CORS diretamente na sua classe SecurityConfigurations.

Aqui está um exemplo de como você pode fazer isso:

@Configuration
@EnableWebSecurity
public class SecurityConfigurations {

    @Autowired
    private SecurityFilter securityFilter;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.cors().and().csrf(csrf -> csrf.disable())
                    .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                    .authorizeHttpRequests(req -> {
                        req.requestMatchers(HttpMethod.POST, "/login").permitAll();
                        req.requestMatchers(HttpMethod.POST, "/usuario/cadastrar").permitAll();
                        req.anyRequest().authenticated();
                    })
                    .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                    .build();
    }


    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
        return configuration.getAuthenticationManager();
    }

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

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

Neste exemplo, eu adicionei o método http.cors().and() antes do csrf e também adicionei um novo bean CorsConfigurationSource que define a configuração de CORS.

Espero que isso resolva o seu problema! Lembre-se, essa é apenas uma sugestão e pode haver outras maneiras de resolver o problema dependendo do contexto do seu projeto.

Espero ter ajudado e bons estudos!