web-dev-qa-db-fra.com

erreur de sécurité du ressort 403

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

36
ken

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");
    }
}
83
Rob Winch

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.