首先需要明确的是,Spring Boot是默认开启CSRF保护的。而Spring Security也是默认开启CSRF保护的。当二者共存时,常常会产生CSRF保护机制引起的跨域问题。那么如何解决SpringSecurity导致SpringBoot跨域失效的问题呢?下面给出完整攻略。
1. 禁用Spring Security的CSRF保护
第一种解决方式是禁用Spring Security的CSRF保护。在Spring Security的配置类中,通过关闭CSRF保护的方式解决跨域问题。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
//配置其他Spring Security相关的代码
}
}
上述代码中的 http.csrf().disable()
就是禁用CSRF保护的方式,Spring Security的其他相关配置可以按照需求进行配置。
2. 配置Spring Boot的CORS支持
第二种解决方式是通过配置Spring Boot的CORS(跨域资源共享)支持解决跨域问题。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//允许所有的请求来源
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
上述代码中的 registry.addMapping("/**")
表示允许所有的请求来源,allowedMethods()
表示允许的请求方法,allowedHeaders()
表示允许的请求头部,allowCredentials(true)
表示允许跨域携带cookie等身份信息。
此外,在Spring Boot的配置文件application.yml或application.properties中,需要加入如下配置项:
#配置CORS支持
spring:
cors:
allowed-origins: "*"
allowed-methods: "GET,POST,PUT,DELETE"
allowed-headers: "*"
allow-credentials: true
上述配置中的 allowed-origins
表示允许的请求来源,allowed-methods
表示允许的请求方法,allowed-headers
表示允许的请求头部,allow-credentials
表示允许跨域携带cookie等身份信息。
下面给出两条示例:
示例一:禁用Spring Security的CSRF保护
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
//配置其他Spring Security相关的代码
}
}
示例二:配置Spring Boot的CORS支持
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
}
#配置CORS支持
spring:
cors:
allowed-origins: "*"
allowed-methods: "GET,POST,PUT,DELETE"
allowed-headers: "*"
allow-credentials: true
希望上述攻略能够帮助你解决SpringSecurity导致SpringBoot跨域失效的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringSecurity导致SpringBoot跨域失效的问题解决 - Python技术站