Puede que se de el caso de que halles algún fallo con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.
Solución:
¡Encontré el motivo de mi problema!
¡Solo necesitaba finalizar la cadena de filtros y devolver el resultado inmediatamente si CorsFilter procesa una solicitud de OPCIONES!
SimpleCorsFilter.java
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter
public SimpleCorsFilter()
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
if ("OPTIONS".equalsIgnoreCase(request.getMethod()))
response.setStatus(HttpServletResponse.SC_OK);
else
chain.doFilter(req, res);
@Override
public void init(FilterConfig filterConfig)
@Override
public void destroy()
Después de eso, podría ignorar la solicitud de verificación previa de OPCIONES en mi AuthServer = D
Entonces, el servidor funciona como en el recorte anterior y puede ignorar el comentario de bloque con la clase MyWebSecurity al principio.
Encontré una solución usando la solución para la pregunta. Pero tengo otra forma de describir la solución:
@Configuration
public class WebSecurityGlobalConfig extends WebSecurityConfigurerAdapter
....
@Override
public void configure(WebSecurity web) throws Exception
web.ignoring()
.antMatchers(HttpMethod.OPTIONS);
...
Me encontré con un problema similar al usar lo siguiente
- back-end
Spring Boot 1.5.8.RELEASE
- Primavera OAuth2
Spring OAuth 2.2.0.RELEASE
w Vuejs
aplicación usandoaxios
biblioteca de solicitudes ajax
Con postman
¡Todo funciona! Cuando comencé a hacer la solicitud de Vuejs
app, entonces obtuve los siguientes errores
OPCIONES http://localhost:8080/springboot/oauth/token 401 ()
y
XMLHttpRequest no puede cargar http://localhost:8080/springboot/oauth/token. La respuesta para la verificación previa tiene un código de estado HTTP no válido 401
Después de leer un poco, descubrí que puedo instruir a mi Spring OAuth
ignorar el OPTIONS
solicitud anulando configure
en mi WebSecurityConfigurerAdapter
clase de implementación de la siguiente manera
@Override
public void configure(WebSecurity web) throws Exception
web.ignoring().antMatchers(HttpMethod.OPTIONS);
La adición de lo anterior ayudó, pero luego, me encontré con el CORS
error especifico
OPCIONES http://localhost:8080/springboot/oauth/token 403 ()
y
XMLHttpRequest no puede cargar http://localhost:8080/springboot/oauth/token. La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay un encabezado ‘Access-Control-Allow-Origin’ en el recurso solicitado. Por lo tanto, no se permite el acceso al origen ‘http://localhost:8000’. La respuesta tenía el código de estado HTTP 403.
Y resolvió el problema anterior con la ayuda de un CorsConfig
Como se muestra abajo
@Configuration
public class CorsConfig
@Bean
public FilterRegistrationBean corsFilterRegistrationBean()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.applyPermitDefaultValues();
config.setAllowCredentials(true);
config.setAllowedOrigins(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowedMethods(Arrays.asList("*"));
config.setExposedHeaders(Arrays.asList("content-length"));
config.setMaxAge(3600L);
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
Después de agregar la clase anterior, funciona como se esperaba. Antes de que me vaya prod
voy a investigar consequences
de uso
web.ignoring().antMatchers(HttpMethod.OPTIONS);
así como best practices
para arriba Cors
configuración. Por ahora *
hace el trabajo, pero definitivamente no es seguro para la producción.
la respuesta de Cyril me ayudo partially
y luego me encontré con el CorsConfig
idea en este número de Github.
Si para ti ha resultado de utilidad nuestro artículo, sería de mucha ayuda si lo compartieras con el resto seniors así contrubuyes a dar difusión a nuestro contenido.