Spring Security中自定义cors配置及原理解析

 更新时间:2024年10月08日 10:46:16   作者:兴趣广泛的程序猿  
在Spring框架中,通过自定义CORS配置可根据实际情况调整URL的协议、主机、端口等,以适应"同源安全策略",配置原理涉及CorsConfigurer和CorsFilter,自定义配置需要注意@Configuration注解、方法名以及可能的@Autowired注解

一、为什么要自定义cors配置

        在使用Spring框架时,Spring Security组件提供了简便的cors配置方案,使程序开发者可以快速的实现“同源安全策略”。关于cors,可以参数之前的一篇文章--关于Spring Security的CORS_springsecurity cors

        由于cors涉及到URL 的协议(Protocol)、主机(Host)、端口(Port,这些东西在每个程序上的情况不同,所以一般情况下都是需要根据实际情况来定制适合的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)被外部调用,实现了两件事,获取一个corsFilter(过滤器)并把这个filter添加到传入的这个名为“http”的对象中。这里也刚好能看出Configurer和Filter的一些关系--configurer会在拿到filter后,通过addFilter(filter)方法将一个filter添加到HttpSecurity对象中。

        再看下getCorsFilter(ApplicationContext context)方法,4个if分支,最终的任务就是new一个CorsFilter并返回。所以自定义cors配置时,可以选择的方法有很多,这里选择创建一个CorsConfigurationSource类型的Bean。这里的getBean方法参数是name和type。所以我们在创建这个Bean的时候,需要确保Bean的名称为“corsConfigurationSource”(CORS_CONFIGURATION_SOURCE_BEAN_NAME对应的字符串),不然这里的getBean会找不到我们自定义创建的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容器启动时,会调用带有@Bean注解的方法来生成对应实例,并将实例注册为与方法名相同的Bean,并管理起来。

2、方法名,第1点说了,注册的Bean名称是和方法名一致的,所以这里的方法名需要是“corsConfigurationSource”,不能自定义方法名。

3、上面代码中的corsFilter()方法,可以不写。因为从前面的Spring Security源码中可以看出,如果没有这个corsFilter的Bean,它也会自己new一个。如果要自定义corsFilter,同样要注意方法名。至于参数,如果有带,需要注意参数类型(参数名可以任意),并在方法名上方多带一个@Autowired注解,这个注解会自动找到类型为UrlBasedCorsConfigurationSource的Bean,并使用它。如果不带参数,那也可以用普通方法,先获取corsConfigurationSource()方法返回的对象,再以些为参数,new一个corsFilter对象。

到此这篇关于Spring Security中自定义cors配置的文章就介绍到这了,更多相关Spring Security cors配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot访问404问题的解决办法

    springboot访问404问题的解决办法

    工作中遇到url404问题,解决问题的进程比较崎岖,写篇文章记录,下面这篇文章主要给大家介绍了关于springboot访问404问题的解决办法,文中通过图文介绍的非常详细,要的朋友可以参考下
    2023-03-03
  • java并发编程专题(一)----线程基础知识

    java并发编程专题(一)----线程基础知识

    这篇文章主要介绍了java并发编程线程的基础知识,文中讲解非常详细,帮助大家更好的学习JAVA并发编程,感兴趣想学习JAVA的可以了解下
    2020-06-06
  • Java在Linux下 不能处理图形的解决办法 分享

    Java在Linux下 不能处理图形的解决办法 分享

    Java在Linux下 不能处理图形的解决办法 分享,需要的朋友可以参考一下
    2013-06-06
  • Spring Cloud Gateway网关XSS过滤方式

    Spring Cloud Gateway网关XSS过滤方式

    这篇文章主要介绍了Spring Cloud Gateway网关XSS过滤方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 详解Springboot之Logback的使用学习

    详解Springboot之Logback的使用学习

    Logback是SpringBoot内置的日志处理框架,你会发现spring-boot-starter其中包含了spring-boot-starter-logging,该依赖内容就是Spring Boot默认的日志框架logback,本文详细介绍了该框架 ,需要的朋友可以参考下
    2021-05-05
  • 如何设计一个安全的API接口详解

    如何设计一个安全的API接口详解

    在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下
    2021-08-08
  • JAVA对称加密算法PBE定义与用法实例分析

    JAVA对称加密算法PBE定义与用法实例分析

    这篇文章主要介绍了JAVA对称加密算法PBE定义与用法,结合实例形式分析了JAVA对称加密算法PBE的概念、原理、定义及使用方法,需要的朋友可以参考下
    2019-09-09
  • java使用FuncGPT慧函数对Mybatis进行一对一查询映射处理

    java使用FuncGPT慧函数对Mybatis进行一对一查询映射处理

    这篇文章主要介绍了java使用FuncGPT慧函数对Mybatis进行一对一查询映射处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • jpa使用manyToOne(opntional=true)踩过的坑及解决

    jpa使用manyToOne(opntional=true)踩过的坑及解决

    这篇文章主要介绍了jpa使用manyToOne(opntional=true)踩过的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springboot对接微信支付的完整流程(附前后端代码)

    springboot对接微信支付的完整流程(附前后端代码)

    最近在做支付平台的项目,承接公司业务系统与第三方支付平台的对接任务,主要涉及微信支付、支付宝支付以及理房通支付等第三方平台,这篇文章主要给大家介绍了关于springboot对接微信支付的完整流程,需要的朋友可以参考下
    2021-08-08

最新评论