J'essaie de sécuriser mon site Web à l'aide de la sécurité Spring en suivant les guides sur le Web. Donc, du côté de mon serveur, WebSecurityConfigurerAdapter et le contrôleur ressemblent à ceci
@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) {
}
}
Ce qui m'a beaucoup dérouté, c'est que le serveur ne répond pas à la méthode POST/DELETE, tandis que la méthode GET fonctionne très bien. BTW, j'utilise RestTemplate du côté client. Les exceptions sont:
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)
J'ai cherché sur Internet pendant des jours. Je n'en ai toujours pas la moindre idée. Veuillez aider. Merci beaucoup
Le problème est probablement dû à protection CSRF . Si les utilisateurs n'utilisent pas votre application dans un navigateur Web, alors il est sûr de désactiver la protection CSRF . Sinon, vous devez vous assurer de inclure le jeton CSRF dans la demande .
Pour désactiver la protection CSRF vous pouvez utiliser ce qui suit:
@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");
}
}
Vérifiez votre jeton que vous envoyez via "En-tête" et recherchez également dans votre base de données le même jeton, que ce jeton existe ou non.
Remarque: ce qui précède n'est applicable que si vous utilisez le mécanisme d'authentification par jeton Spring Boot.