Spring?Security中自定義cors配置及原理解析
一、為什么要自定義cors配置
在使用Spring框架時,Spring Security組件提供了簡便的cors配置方案,使程序開發(fā)者可以快速的實現(xiàn)“同源安全策略”。關(guān)于cors,可以參數(shù)之前的一篇文章--關(guān)于Spring Security的CORS_springsecurity cors
由于cors涉及到URL 的協(xié)議(Protocol)、主機(Host)、端口(Port,這些東西在每個程序上的情況不同,所以一般情況下都是需要根據(jù)實際情況來定制適合的cors配置。
二、配置原理
我們可以先看下Spring Security組件的一個源碼。
org.springframework.security.config.annotation.web.configurers.CorsConfigurer.class
@Override public void configure(H http) { ApplicationContext context = http.getSharedObject(ApplicationContext.class); CorsFilter corsFilter = getCorsFilter(context); Assert.state(corsFilter != null, () -> "Please configure either a " + CORS_FILTER_BEAN_NAME + " bean or a " + CORS_CONFIGURATION_SOURCE_BEAN_NAME + "bean."); http.addFilter(corsFilter); } private CorsFilter getCorsFilter(ApplicationContext context) { if (this.configurationSource != null) { return new CorsFilter(this.configurationSource); } boolean containsCorsFilter = context.containsBeanDefinition(CORS_FILTER_BEAN_NAME); if (containsCorsFilter) { return context.getBean(CORS_FILTER_BEAN_NAME, CorsFilter.class); } boolean containsCorsSource = context.containsBean(CORS_CONFIGURATION_SOURCE_BEAN_NAME); if (containsCorsSource) { CorsConfigurationSource configurationSource = context.getBean(CORS_CONFIGURATION_SOURCE_BEAN_NAME, CorsConfigurationSource.class); return new CorsFilter(configurationSource); } if (mvcPresent) { return MvcCorsFilter.getMvcCorsFilter(context); } return null; }
這段源碼簡單、清晰,兩個方法,一個公有,一個私有。configure(H http)被外部調(diào)用,實現(xiàn)了兩件事,獲取一個corsFilter(過濾器)并把這個filter添加到傳入的這個名為“http”的對象中。這里也剛好能看出Configurer和Filter的一些關(guān)系--configurer會在拿到filter后,通過addFilter(filter)方法將一個filter添加到HttpSecurity對象中。
再看下getCorsFilter(ApplicationContext context)方法,4個if分支,最終的任務(wù)就是new一個CorsFilter并返回。所以自定義cors配置時,可以選擇的方法有很多,這里選擇創(chuàng)建一個CorsConfigurationSource類型的Bean。這里的getBean方法參數(shù)是name和type。所以我們在創(chuàng)建這個Bean的時候,需要確保Bean的名稱為“corsConfigurationSource”(CORS_CONFIGURATION_SOURCE_BEAN_NAME對應(yīng)的字符串),不然這里的getBean會找不到我們自定義創(chuàng)建的CorsConfigurationSource。
三、自定義配置
@Configuration public class SecurityConfig { /** * 跨域資源共享過濾器 */ @Autowired @Bean public CorsFilter corsFilter(UrlBasedCorsConfigurationSource configurationSource){ return new CorsFilter(configurationSource); } /** * 跨域資源共享過濾器配置 */ @Bean public UrlBasedCorsConfigurationSource corsConfigurationSource(){ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.setAllowCredentials(true); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.addAllowedOriginPattern("http://localhost*"); source.registerCorsConfiguration("/**",corsConfiguration); return source; } }
幾個要注意的地方:
1、類名上方的@Configuration注解,這個是為了指定該類為配置類,Spring容器啟動時,會調(diào)用帶有@Bean注解的方法來生成對應(yīng)實例,并將實例注冊為與方法名相同的Bean,并管理起來。
2、方法名,第1點說了,注冊的Bean名稱是和方法名一致的,所以這里的方法名需要是“corsConfigurationSource”,不能自定義方法名。
3、上面代碼中的corsFilter()方法,可以不寫。因為從前面的Spring Security源碼中可以看出,如果沒有這個corsFilter的Bean,它也會自己new一個。如果要自定義corsFilter,同樣要注意方法名。至于參數(shù),如果有帶,需要注意參數(shù)類型(參數(shù)名可以任意),并在方法名上方多帶一個@Autowired注解,這個注解會自動找到類型為UrlBasedCorsConfigurationSource的Bean,并使用它。如果不帶參數(shù),那也可以用普通方法,先獲取corsConfigurationSource()方法返回的對象,再以些為參數(shù),new一個corsFilter對象。
到此這篇關(guān)于Spring Security中自定義cors配置的文章就介紹到這了,更多相關(guān)Spring Security cors配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報錯問題
這篇文章主要介紹了MyBatisPuls多數(shù)據(jù)源操作數(shù)據(jù)源偶爾報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06ASM源碼學(xué)習(xí)之ClassReader、ClassVisitor與ClassWriter詳解
這篇文章主要給大家介紹了ASM源碼之ClassReader、ClassVisitor與ClassWriter的相關(guān)資料,文中介紹的非常相信,相信對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01詳解Spring Security中權(quán)限注解的使用
這篇文章主要為大家詳細介紹一下Spring Security中權(quán)限注解的使用方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定參考價值,需要的可以參考一下2022-05-05Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解
這篇文章主要介紹了Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解,類加載器是Java虛擬機(JVM)的一個重要組成部分,它的主要作用是將類的字節(jié)碼加載到內(nèi)存中,并生成對應(yīng)的Class對象,需要的朋友可以參考下2023-07-07Java 添加、更新和移除PDF超鏈接的實現(xiàn)方法
PDF超鏈接用一個簡單的鏈接包含了大量的信息,滿足了人們在不占用太多空間的情況下渲染外部信息的需求。這篇文章主要介紹了Java 添加、更新和移除PDF超鏈接的實現(xiàn)方法,需要的朋友可以參考下2019-05-05