1. Descripción general
En este breve artículo, aprenderemos cómo configurar CORS en Spring Security 6. En resumen, actualizaremos el SecurityFilterChain
para proporcionar una solución que mantenga nuestra aplicación segura y funcional. Entender cómo hacerlo nos ayudará a alejarnos del método cors()
obsoleto en las versiones anteriores del Spring Security Framework.
Comencemos.
2. Entendiendo CORS en Spring Security
Antes de sumergirnos directamente en la configuración, primero comprendamos qué es CORS y cómo se gestiona en Spring Security.
Cross-Origin Resource Sharing (CORS) es una característica de seguridad implementada en los navegadores para prevenir que scripts maliciosos accedan a recursos de diferentes dominios. Por lo tanto, necesitamos configurar CORS correctamente en nuestras aplicaciones Spring y restringir el intercambio de recursos entre diferentes orígenes. No hacerlo puede llevar al acceso no autorizado a los recursos del servidor por parte de páginas web de diferentes dominios.
A partir de Spring Security 6, el método cors()
fue deprecado y marcado para ser eliminado en futuras versiones. Por lo tanto, al trabajar con aplicaciones heredadas, debemos adaptar nuestras configuraciones de seguridad para gestionar CORS de manera efectiva.
Veamos varias opciones en las que podemos manejar la configuración de CORS para mantener nuestra aplicación funcional.
3. Deshabilitando CORS en SecurityFilterChain
La forma más sencilla de manejar CORS es desactivarlo por completo. Podemos hacerlo en el bean de configuración SecurityFilterChain
:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.cors(AbstractHttpConfigurer::disable)
// MORE CODE
.build();
}
Deshabilitar una característica de seguridad como CORS puede exponer nuestra aplicación a vulnerabilidades. Por lo tanto, es esencial comprender las implicaciones de deshabilitar CORS y asegurarnos de que nuestra aplicación permanezca segura.
3. Configurando CORS en SecurityFilterChain
Si queremos asegurar nuestra aplicación con CORS habilitado, debemos configurarlo en el bean SecurityFilterChain
. Hay dos pasos para ello. Primero, necesitamos crear una configuración para nuestro CORS. Segundo, debemos aplicar esta configuración a nuestro SecurityFilterChain
.
3.1. Configuración Personalizada de CORS
Para aplicaciones que requieren configuraciones específicas de CORS, podemos definir un CorsConfigurationSource
personalizado. Esta configuración especificará los orígenes permitidos, métodos, encabezados y otros parámetros que nuestra aplicación entenderá:
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowedOrigins(List.of("http://localhost:1234"));
corsConfiguration.setAllowedMethods(List.of("GET", "POST"));
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setAllowedHeaders(List.of("*"));
corsConfiguration.setMaxAge(3600L);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}
En resumen, creamos un @Bean de tipo CorsConfigurationSource
que está registrado en un UrlBasedCorsConfigurationSource
vinculado a la ruta /**
. En esta configuración, permitimos solicitudes desde http://localhost:1234
, especificamos métodos HTTP permitidos y establecemos otros parámetros CORS, como credenciales, encabezados y tiempo máximo de vida.
Aquí, estos parámetros significan:
allowedOrigins
: La lista de orígenes que tienen permitido acceder a los recursos.allowedMethods
: La lista de métodos HTTP que están permitidos.allowCredentials
: Si el navegador debe incluir credenciales como cookies en la solicitud.allowedHeaders
: La lista de encabezados que están permitidos en la solicitud.maxAge
: El tiempo máximo en segundos que el navegador debe almacenar en caché la respuesta preflight.
3.2. Configurar CorsConfigurationSource
en SecurityFilterChain
Ahora, necesitamos aplicar esta configuración personalizada de CORS a nuestro SecurityFilterChain
:
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
return http.csrf(AbstractHttpConfigurer::disable)
.cors(httpSecurityCorsConfigurer -> httpSecurityCorsConfigurer.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(requests -> requests
// MORE CODE
)
.build();
}
Esto completa nuestra configuración de CORS en el SecurityFilterChain
. Hemos aplicado con éxito nuestra configuración personalizada de CORS para asegurar nuestra aplicación de manera efectiva.
4. Conclusión
En este artículo, aprendimos sobre la configuración de CORS. Primero, proporcionamos una forma de desactivar CORS en el SecurityFilterChain
. Luego, exploramos cómo crear una configuración personalizada de CORS y aplicarla al SecurityFilterChain
.
Podemos buscar el código completo en Github.