104 votes

Configuration de Spring Security : erreur HTTP 403

Je suis en train de sécuriser mon site web en utilisant Spring Security en suivant les guides sur le web.

Donc, du côté serveur, j'ai les classes suivantes.

Mon WebSecurityConfigurerAdapter:

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

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

Mon contrôleur:

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

    @RequestMapping(value="/course", method = RequestMethod.GET, produces="application/json")
    public @ResponseBody List get(  // Le critère utilisé pour trouver.
        @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 upload(@RequestBody Course[] cs) {

    }
}

Ce qui me perturbe beaucoup, c'est que le serveur ne répond pas à la méthode POST/DELETE, alors que la méthode GET fonctionne bien. Au fait, j'utilise RestTemplate côté client.

Les exceptions sont les suivantes:

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'ai toujours pas d'idée. S'il vous plaît aidez. Merci beaucoup

234voto

Rob Winch Points 15031

Le problème est probablement dû à la 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 devriez vous assurer d' inclure le jeton CSRF dans la requête.

Pour désactiver la protection CSRF, vous pouvez utiliser le code suivant:

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

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

    @Override
    protected void registerAuthentication(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
        authManagerBuilder
            .inMemoryAuthentication()
                .withUser("utilisateur").password("mot de passe").roles("ADMIN");
    }
}

8voto

bigdba Points 81

Le problème est probablement dû à la protection CSRF, je suis d'accord avec le commentaire ci-dessus. Néanmoins, en utilisant cette configuration, la méthode annule la sécurité Spring.

Vous pouvez utiliser le code suivant :

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();

        auth
                .inMemoryAuthentication()
                    .withUser("admin")
                        .password(encoder.encode("admin"))
                        .roles("ADMIN", "USER")
                .and()
                    .withUser("user")
                        .password(encoder.encode("password"))
                        .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();

        http.csrf().disable();
    }
}

5voto

omar fesal Points 81

Le problème peut être lié à la protection de sécurité CSRF ou CORS.

  • POUR CSRF: Vous pouvez le désactiver si les utilisateurs de l'application ne l'utilisent pas à partir des navigateurs.
  • Pour CORS: Vous pouvez spécifier l'origine et autoriser les méthodes HTTP.

Le code ci-dessous désactive CSRF et autorise toutes les origines et méthodes HTTP, donc soyez prudent lorsque vous l'utilisez.

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

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

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("*");
    }

}

5voto

Dominik H. Points 51

J'ai eu ce problème après avoir mis à jour mon service vers Spring Boot 3. Les tests automatiques ont commencé à échouer avec un statut 403. Après pas mal de maux de tête, j'ai découvert que cela était dû à la suppression de la barre oblique finale de l'URL correspondante. Le changement est décrit ici. Donc vérifiez que vous appelez la bonne URL.

Faux :

/api/foo/

Correct :

/api/foo

2voto

8ryan8 Points 51

J'ai également cherché pendant des jours! Simplement en désactivant CSRF sur votre méthode configure avec http.csrf().disable(); c'était tout ce qui devait être fait pour que mes requêtes put arrêtent de recevoir des 403.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X