Deshabilitar Spring Security para OPCIONES Método Http

¿Es posible desactivar Spring Security para un tipo de método HTTP?

Tenemos una aplicación Spring REST con servicios que requieren que el token de Autorización se adjunte en el encabezado de la solicitud http. Estoy escribiendo un cliente JS para él y utilizando JQuery para enviar las solicitudes GET / POST. La aplicación está CORS habilitada con este código de filtro.

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 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()); } 

Pero cuando JQuery envía la solicitud OPTIONS para CORS, el servidor responde con el token de autorización fallida. Claramente, la solicitud OPTIONS carece de token de autorización. Entonces, ¿es posible dejar que las OPCIONES escapen de la capa de seguridad de la configuración de Spring Security?

Has probado esto

Puede usar múltiples elementos para definir diferentes requisitos de acceso para diferentes conjuntos de URL, pero se evaluarán en el orden indicado y se usará la primera coincidencia. Por lo tanto, debe colocar las coincidencias más específicas en la parte superior. También puede agregar un atributo de método para limitar la coincidencia con un método HTTP particular (GET, POST, PUT, etc.).

     

Más arriba significa que debe seleccionar el patrón de URL para interceptar y qué métodos desea

Si está utilizando un archivo de configuración de seguridad basado en anotaciones (@EnableWebSecurity & @Configuration) puede hacer algo como lo siguiente en el método configure () para permitir que SpringSecurity permita las solicitudes OPTION sin autenticación para una ruta determinada:

 @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(); } 

Permitir todas las OPCIONES en contexto:

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

En caso de que alguien esté buscando una solución fácil usando Spring Boot. Solo agrega un bean adicional:

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

Tenga en cuenta que, dependiendo de su aplicación, esto puede abrirlo para posibles exploits.

Problema abierto para una mejor solución: https://github.com/spring-projects/spring-security/issues/4448