web-dev-qa-db-fra.com

Désactiver la sécurité de printemps pour la méthode HTTP OPTIONS

Est-il possible de désactiver Spring Security pour un type de méthode HTTP?

Nous avons une application Spring REST) avec les services qui nécessitent l'attachement du jeton d'autorisation dans l'en-tête de la requête http. J'écris un client JS pour cette application et j'utilise JQuery pour envoyer les demandes GET/POST. L'application CORS est activée avec ce code de filtre.

doFilter(....) {

  HttpServletResponse httpResp = (HttpServletResponse) response;
  httpResp.setHeader("Access-Control-Allow-Origin", "*");
  httpResp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
  httpResp.setHeader("Access-Control-Max-Age", "3600");
  Enumeration<String> headersEnum = ((HttpServletRequest) request).getHeaders("Access-Control-Request-Headers");
  StringBuilder headers = new StringBuilder();
  String delim = "";
  while (headersEnum.hasMoreElements()) {
    headers.append(delim).append(headersEnum.nextElement());
    delim = ", ";
  }
  httpResp.setHeader("Access-Control-Allow-Headers", headers.toString());
}

Mais lorsque JQuery envoie la demande OPTIONS pour CORS, le serveur répond avec le jeton Echec de l'autorisation. Il est clair que la demande OPTIONS manque du jeton d'autorisation. Alors, est-il possible de laisser les OPTIONS sortir de la couche de sécurité Spring de la couche de sécurité?

65
Dhanush Gopinath

Avez-vous essayé cela

Vous pouvez utiliser plusieurs éléments pour définir différentes conditions d'accès pour différents ensembles d'URL, mais elles seront évaluées dans l'ordre indiqué et la première correspondance sera utilisée. Donc, vous devez mettre les matchs les plus spécifiques en haut. Vous pouvez également ajouter un attribut de méthode pour limiter la correspondance à une méthode HTTP particulière (GET, POST, PUT, etc.).

<http auto-config="true">
    <intercept-url pattern="/client/edit" access="isAuthenticated" method="GET" />
    <intercept-url pattern="/client/edit" access="hasRole('EDITOR')" method="POST" />
</http>

Ci-dessus signifie que vous devez sélectionner le modèle d'URL à intercepter et quelles méthodes vous souhaitez

11
Koitoer

Si vous utilisez un fichier de configuration de sécurité basé sur des annotations (@EnableWebSecurity & @Configuration), Vous pouvez procéder de la manière suivante dans la méthode configure() pour autoriser le OPTION demandes autorisées par Spring Security sans authentification pour un chemin donné:

@Override
protected void configure(HttpSecurity http) throws Exception
{
     http
    .csrf().disable()
    .authorizeRequests()
      .antMatchers(HttpMethod.OPTIONS,"/path/to/allow").permitAll()//allow CORS option calls
      .antMatchers("/resources/**").permitAll()
      .anyRequest().authenticated()
    .and()
    .formLogin()
    .and()
    .httpBasic();
}
130
Felby

Autoriser toutes les options dans le contexte:

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
    }
39
Luc S.

Dans le cas où quelqu'un recherche une solution simple avec Spring Boot. Ajoutez simplement un haricot supplémentaire:

   @Bean
   public IgnoredRequestCustomizer optionsIgnoredRequestsCustomizer() {
      return configurer -> {
         List<RequestMatcher> matchers = new ArrayList<>();
         matchers.add(new AntPathRequestMatcher("/**", "OPTIONS"));
         configurer.requestMatchers(new OrRequestMatcher(matchers));
      };
   }

Veuillez noter que selon votre application, cela peut être ouvert à des exploits potentiels.

Question ouverte pour une meilleure solution: https://github.com/spring-projects/spring-security/issues/4448

3
Dennis Kieselhorst