CORS(跨源资源共享)是一种由Web浏览器实现的安全特性,用于防止网站未经授权地向不同域发起请求。CORS通过HTTP头部来指定哪些来源被允许访问Web服务器上的资源。
CORS对于保护Web应用程序至关重要,因为它通过控制跨域请求来维护安全性。如果CORS配置不当,应用程序可能会面临跨站请求伪造(CSRF)和跨站脚本攻击(XSS)等安全威胁。正确配置CORS有助于确保只有受信任的域可以访问资源。
Spring Security 6提供了一种现代的方法来配置CORS,使用SecurityFilterChain和CorsConfigurationSource接口。这种设置提供了一种清晰且灵活的方式来管理CORS策略。
下面是一个使用Spring Security 6在Spring Boot应用程序中配置CORS的基本示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.servlet.config.annotation.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.cors(c -> c.configurationSource(corsConfigurationSource()))
.csrf().disable()
.authorizeRequests(authorizeRequests ->
authorizeRequests.anyRequest().authenticated()
);
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://example.com"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
在这个示例中:
对于更复杂的需求,例如允许特定的头部并暴露额外的头部,可以增强CORS配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.servlet.config.annotation.CorsConfiguration;
import org.springframework.web.servlet.config.annotation.CorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.cors(c -> c.configurationSource(corsConfigurationSource()))
.csrf().disable()
.authorizeRequests(authorizeRequests ->
authorizeRequests.anyRequest().authenticated()
);
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://example.com"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.setAllowCredentials(true);
configuration.setExposedHeaders(Arrays.asList("Authorization", "Content-Type"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
在高级配置中:
一旦设置了CORS,测试它是否按预期工作至关重要。以下是可以进行测试的方法:
打开Postman并创建一个新的请求。 将请求方法设置为GET并输入API端点。 在Headers标签下,添加一个新的头部Origin,值为http://example.com。 发送请求并检查响应头部中是否有Access-Control-Allow-Origin头部。
示例结果:
应该看到类似这样的响应头部:
Access-Control-Allow-Origin: http://example.com
在浏览器中打开Web应用程序。 打开浏览器的开发者工具(F12或右键单击并选择“检查”)。 转到Network标签并请求API。 检查响应头部以确保Access-Control-Allow-Origin存在且设置正确。
示例结果:
在Network标签下的Headers部分,应该看到:
Access-Control-Allow-Origin: http://example.com