springSecurity跨域CORS處理


續言

之前 知識追尋者寫過關於springboot 的跨域處理,並且介紹了跨域相關的概念;具體的可以查看這篇知識追尋者springboot教程系列文章

https://zszxz.com/category/springboot/article/16

關於跨域處理其實挺奇怪,spring, springboot, springSecurity 他們的跨域處理方式都不同!

spring的跨域處理

關於spring的跨域處理可以直接在類或者方法上使用 @CrossOrigin 達到目的;但這只能進行局部處理,如果需要全局處理則需要按如下方式進行配置

 
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
 
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
 
        registry.addMapping("/api/**")
            .allowedOrigins("https://zszxz.com")
            .allowedMethods("GET","POST","PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);
 
        // ...
    }
}

springboot 跨域處理

在springboot 中 一般情況下可以使用 springMvc的跨域方式配置,但是有時關於系統配置jdk等問題,會造成跨域失效,則需要按如下方式進行配置

@Configuration
public class WebConfig  {

    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("https://zszxz.com");
        //是否發送 Cookie
        config.setAllowCredentials(true);
        //放行哪些請求方式
        config.addAllowedMethod("*");
        //放行哪些原始請求頭部信息
        config.addAllowedHeader("*");
        //暴露哪些頭部信息
        //config.addExposedHeader("*");
        //2. 添加映射路徑
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }

}

springSecurity跨域處理

在springSecurity中 配置方式和springboot 的配置區別方式不一樣 ,則需要按如下方式進行配置。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // by default uses a Bean by the name of corsConfigurationSource
            .cors().and()
            ...
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://zszxz.com"));
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

官方示例中,以下這種配置,知識追尋者試過,沒生效

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // if Spring MVC is on classpath and no CorsConfigurationSource is provided,
            // Spring Security will use CORS configuration provided to Spring MVC
            .cors().and()
            ...
    }
}

網上 說需要將 X-Frame-Options 頭禁用調即可,當然我使用第一種方式就可以了,此方式不再嘗試, 有興趣的讀者可以進行驗證!

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 開啟允許iframe 嵌套
        http.headers().frameOptions().disable();

        http.csrf().disable()
            // 開啟跨域
            .cors().and()

            .....
    }

}

本套教程

源碼地址: 關注公眾號知識追尋者:回復 springSecurity 獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM