2016-02-10 31 views
10

Aggiornamento: Ora ripenso a più di un anno dopo, sto dando un aggiornamento sperando che possa aiutare qualcun altro.Errore di avvio di primavera Problema di supporto Global CORS: solo GET funziona, POST, PUT e Delete non funzionano

Spring IO consiglia di utilizzare la protezione CSRF per qualsiasi richiesta che possa essere elaborata da un browser da parte di utenti normali. Se si sta solo creando un servizio che viene utilizzato da client non-browser, è probabile che si desideri disabilitare la protezione CSRF. Poiché la mia app è un'API e verrà elaborata da un browser, quindi disabilitare CSRF non è un approccio.

CSRF è abilitato con Spring Boot per impostazione predefinita, è necessario aggiungere il seguente codice per aggiungere un repository CSRF e un filtro per aggiungere il token CSRF alle proprie richieste http. (La soluzione viene da qui Invalid CSRF Token in POST request)

@Override 
protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/assets/**", "/templates/**", "/custom-fonts/**", "/api/profile/**", "/h2/**").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
      .logout() 
       .logoutSuccessUrl("/login?logout") 
       .permitAll() 
       .and() 
      .csrf().csrfTokenRepository(csrfTokenRepository()) 
       .and() 
      .addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter. 
       } 

Il filtro & CsrfToken Repository parte:

private Filter csrfHeaderFilter() { 
    return new OncePerRequestFilter() { 

     @Override 
     protected void doFilterInternal(HttpServletRequest request, 
             HttpServletResponse response, 
             FilterChain filterChain) throws ServletException, IOException { 

      CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); 
      if (csrf != null) { 
       Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
       String token = csrf.getToken(); 
       if (cookie == null || token != null 
         && !token.equals(cookie.getValue())) { 

        // Token is being added to the XSRF-TOKEN cookie. 
        cookie = new Cookie("XSRF-TOKEN", token); 
        cookie.setPath("/"); 
        response.addCookie(cookie); 
       } 
      } 
      filterChain.doFilter(request, response); 
     } 
    }; 
} 


private CsrfTokenRepository csrfTokenRepository() { 
     HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
     repository.setHeaderName("X-XSRF-TOKEN"); 
     return repository; 
    } 

domanda originale ho chiesto di nuovo nel febbraio 2016

ho lavorare sul enabeing Global Supporto CORS per un'API RESTful Spring-boot con Spring 4.

Seguo il Doc ufficiale Primavera Boot (https://spring.io/guides/gs/rest-service-cors/) e hanno aggiunto questo al mio Applicazione:

public class SomeApiApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(SomeApiApplication.class, args); 
    } 


    //Enable Global CORS support for the application 
    @Bean 
    public WebMvcConfigurer corsConfigurer() { 
     return new WebMvcConfigurerAdapter() { 
      @Override 
      public void addCorsMappings(CorsRegistry registry) { 
       registry.addMapping("/**") 
         .allowedOrigins("http://localhost:8080") 
         .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD") 
         .allowedHeaders("header1", "header2") //What is this for? 
         .allowCredentials(true); 
      } 
     }; 
    } 
} 

Non capisco il motivo per cui si ottiene solo sta lavorando, per il resto delle chiamate HTTP, sto ottenendo un messaggio di errore che dice "Richiesta CORS non valida". Mi manca qualcosa nel set up? Se il mio set up non è corretto, GET non dovrebbe funzionare altrettanto bene. Sono molto confuso.

+0

tenta di registrare configurazione XML – Abdelhak

+0

Sto usando postino alla prova. Per le intestazioni delle mie richieste, ho l'autorizzazione e il tipo di contenuto. Mi chiedo se è necessario inserire qualche intestazione aggiuntiva per CORS? –

+0

@Abdelhak: Sto usando Spring 4, non dovrei avere alcun codice XML nel mio codice. –

risposta

2

Avevo un problema simile e ho capito che @CrossOrigin sul mio controller doveva essere rimosso per risolvere il problema. Ancora per capire perché questo sta causando "Richiesta CORS non valida".

4

Ho avuto lo stesso problema: GET ha funzionato. POST no. Ho cercato una risposta nel dominio CORS ma alla fine ho scoperto che era dovuto alla protezione CSRF. per risolverlo, ho disabile protezione CSRF nella configurazione della sicurezza:

@Configuration @EnableWebSecurity 
    public class SpringWebSecurityConfiguration extends WebSecurityConfigurerAdapter { 
     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       **.csrf().disable()** //TODO: for production, must be reconfigured in order to disable only in specific cases. This line was added because without it, HTTP POST requests did not work. 
       .authorizeRequests() 
        .antMatchers("/api/**").permitAll() 
        .anyRequest().authenticated() 
        .and() 
       .formLogin() 
        .loginPage("/login") 
        .permitAll() 
        .and() 
       .logout() 
        .permitAll(); 
     } 

Assicurati di capire quello che stai facendo: https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html

5

tenta di modificare allowedOrigins metodo per .allowedOrigins("*"). Postman è un'estensione e viene eseguito in un altro "host".

Ma assicurarsi di aver compreso gli impatti: https://spring.io/understanding/CORS

Problemi correlati