2013-10-19 23 views
10

Sto provando a proteggere il mio sito web usando la sicurezza Spring seguendo le guide sul web. Così il mio lato server WebSecurityConfigurerAdapter e il controller sembra che questospring security 403 error

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
implements ApplicationContextAware { 

@Override 
protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception { 
authManagerBuilder.inMemoryAuthentication() 
.withUser("user").password("password").roles("ADMI N"); 
} 
} 

@Controller 
//@RequestMapping("/course") 
public class CourseController implements ApplicationContextAware{ 

@RequestMapping(value="/course", method = RequestMethod.GET, produces="application/json") 
public @ResponseBody List<Course> get(// The critirion used to find. 
@RequestParam(value="what", required=true) String what, 
@RequestParam(value="value", required=true) String value) { 
//..... 
} 

@RequestMapping(value="/course", method = RequestMethod.POST, produces="application/json") 
public List<Course> upload(@RequestBody Course[] cs) { 
} 
} 

Cosa confuso me molto è il server non risponde al metodo POST/DELETE, mentre il metodo GET funziona bene. A proposito, sto usando RestTemplate sul lato client. Eccezioni sono:

Exception in thread "main" org.springframework.web.client.HttpClientErrorException: 403 Forbidden 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 
    at org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:574) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:530) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:487) 
    at org.springframework.web.client.RestTemplate.delete(RestTemplate.java:385) 
    at hello.Application.createRestTemplate(Application.java:149) 
    at hello.Application.main(Application.java:99) 

Ho cercato su Internet per giorni. Ancora non ne ho idea. Per favore aiuto. Grazie mille

+0

è corretto? ruoli ("ADMI N"). C'è uno spazio tra "I" e "N". –

risposta

29

Il problema è probabilmente dovuto a . Se gli utenti non utilizzeranno l'applicazione in un browser Web, protezione then it is safe to disable CSRF. Altrimenti dovresti assicurarti di include the CSRF token in the request.

Per disable CSRF protection è possibile utilizzare il seguente:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig 
    extends WebSecurityConfigurerAdapter implements ApplicationContextAware { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      // ... 
      .csrf().disable(); 
    } 

    @Override 
    protected void registerAuthentication(AuthenticationManagerBuilde r authManagerBuilder) throws Exception { 
     authManagerBuilder 
      .inMemoryAuthentication() 
       .withUser("user").password("password").roles("ADMIN"); 
    } 
} 
+0

Grazie Rob. È il problema csrf. Sì, non voglio che i miei utenti utilizzino il browser Web per utilizzare la mia applicazione. Sta funzionando bene sul lato client. Ma sul lato server ottengo questo: o.s.web.servlet.PageNotFound: metodo di richiesta 'POST' non supportato Strano. dovrei ignorarlo? – ken

+1

Penso che PageNotFound sia un problema a parte che vorrei affrontare. Probabilmente dovrai pubblicare un'altra domanda con ulteriori informazioni su questo errore. –