1
votes

Annotation CrossOrigin ne fonctionne pas dans Spring Boot

J'ai une application Spring Boot qui expose certains points de terminaison. À partir d'une application React, je souhaite envoyer des requêtes à ces points de terminaison, mais cela me pose toujours un problème CORS:

accès à XMLHttpRequest à 'localhost: 9090 / helios-admin / api / dashboard / clients? page = 0 & size = 30' de l'origine « http: // localhost: 3000 » a été bloqué par la stratégie CORS: Les demandes d'origine croisée ne sont prises en charge que pour les schémas de protocole: http données, chrome, extension chrome, https.

J'ai donc essayé d'utiliser l'annotation @CrossOrigin pour toutes mes méthodes et aussi pour la classe Controller, mais l'erreur est la même.
La demande d'obtention dans mon application React ressemble à ceci:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {



    @Autowired
    SysdataUserDetailsService sysdataUserDetailsService;



    @Autowired
    private JwtAuthEntryPoint jwtAuthEntryPoint;



    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(sysdataUserDetailsService)
                .passwordEncoder(encoder());
    }



    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().authorizeRequests()
                .antMatchers(PathConstants.USER_AUTH +"/**", PathConstants.HELIOS+"/dashboard/**").permitAll()
                .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll()
                .antMatchers(HttpMethod.POST, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll()
                .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_INSTANCE+"/**").permitAll()
                //.anyRequest().authenticated()
                .anyRequest().permitAll()
                .and()
                .exceptionHandling().authenticationEntryPoint(jwtAuthEntryPoint).and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // custom jwt filter.
        http.addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

Que manque-t-il?

MODIFIER Dans mon application Spring Boot, je n'ai que cette classe pour configurer la sécurité:

constructor() {
        this.url = 'localhost:9090/helios-admin/api/dashboard/clients?page=0&size=30';
    }

    getProjectStatusById(projectId) {
        Axios.get(this.url).then(res=>{
            console.log(res.data);
        })
    }


1 commentaires

Avez-vous String Security?


3 Réponses :


1
votes

Vous pouvez créer une classe de configuration CORS distincte comme suit. Cette classe gérera les configurations CORS pour toutes les requêtes de votre application et vous n'avez pas besoin d'annoter chaque contrôleur séparément avec @CrossOrigin.

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");         //'*' allows all endpoints, Provide your URL/endpoint, if any.
        config.addAllowedHeader("*");         
        config.addAllowedMethod("POST");   //add the methods you want to allow like 'GET', 'PUT',etc. using similar statements.
        config.addAllowedMethod("GET");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}


5 commentaires

Dois-je appeler la méthode quelque part ou va-t-elle tout faire d'elle-même puisque c'est @Configuration? Parce que j'ai ajouté la classe mais cela ne fonctionne pas: \


@Dseaster Vous n'avez besoin d'appeler la méthode nulle part. Il fera tout par lui-même.


Ok, mais ça ne marche pas ... Continue de me donner l'erreur. J'ai copié votre code et ajouté toutes les méthodes dont j'ai besoin


@Dseaster Chaque type de méthode va dans une instruction distincte. J'ai modifié l'extrait de code dans ma réponse.


Oui, je les ai ajoutés comme ça



2
votes

Vous pouvez l'ajouter en remplaçant addCorsMappings de WebMvcConfigurerAdapter , donc créez une classe qui étend WebMvcConfigurerAdapter ou définissez un bean dans votre classe de configuration comme ceci:

@Configuration
@EnableWebMvc
public class MyWebMvcConfig implements WebMvcConfigurer {

   @Override
   public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                    .allowedOrigins("http://domain1.com", "http://domain2.com")
                    .allowedMethods("GET", "OPTIONS")
                    .allowedHeaders("header1", "header2", "header3")
                    .exposedHeaders("header1", "header2")
                    .allowCredentials(false).maxAge(3600);
   }
 }

Edit

À partir de 5.0 WebMvcConfigurerAdapter est obsolète et vous pouvez donc réaliser la même chose en implémentant l'interface WebMvcConfigurer (ajout de méthodes par défaut, merci java 8! et peut être implémenté directement sans avoir besoin de cet adaptateur)

    @Bean
    public WebMvcConfigurer corsConfigurer () {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                        .allowedOrigins("http://domain1.com", "http://domain2.com")
                        .allowedMethods("GET", "OPTIONS")
                        .allowedHeaders("header1", "header2", "header3")
                        .exposedHeaders("header1", "header2")
                        .allowCredentials(false).maxAge(3600);
            }
        }
    }


4 commentaires

WebMvcConfigurerAdapter est obsolète


@Dseaster merci pour votre réponse, vous pouvez voir ma modification


Bonjour, j'ai essayé votre nouvelle solution mais cela ne fonctionne pas. Est-il nécessaire de spécifier les allowHeader et ExhibisHeaders?


@Usr Avez-vous réussi à le faire fonctionner? J'ai le même problème dans aucune solution partout dans Stack Overflow ni dans les documents Spring ne fonctionnaient pour moi.



0
votes

Vous pouvez ajouter une configuration globale comme

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
            }
        };
    }

Utilisez simplement ceci pour ajouter une configuration corrs globale qui affectera tous les points de terminaison. Essayez ceci si l'annotation ne fonctionne pas. p >


0 commentaires