Spring Security中自定义cors配置

server/2024/12/22 2:09:14/

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

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

        由于cors涉及到URL 的协议(Protocol)、主机(Host)、端口(Port,这些东西在每个程序上的情况不同,所以一般情况下都是需要根据实际情况来定制适合的cors配置。

二、配置原理

        我们可以先看下Spring Security组件的一个源码。

        org.springframework.security.config.annotation.web.configurers.CorsConfigurer.class

java">    @Overridepublic 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。

三、自定义配置

java">@Configuration
public class SecurityConfig {/*** 跨域资源共享过滤器*/@Autowired@Beanpublic CorsFilter corsFilter(UrlBasedCorsConfigurationSource configurationSource){return new CorsFilter(configurationSource);}/*** 跨域资源共享过滤器配置*/@Beanpublic 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对象。


http://www.ppmy.cn/server/124986.html

相关文章

【Router】路由功能之端口转发(Port Forward)功能介绍及实现

端口转发(Port Forward) 端口转发是一种网络技术,它允许将传入到一个网络设备特定端口的网络流量转发到另一个设备的特定端口上,端口转发会创建一条通过路由器的路径,以便数据包可以到达网络内的设备。在路由器中创建端口转发可以打开对 Internet 上某些应用程序的访问。端…

动态规划算法专题(一):斐波那契数列模型

目录 1、动态规划简介 2、算法实战应用【leetcode】 2.1 题一:第N个泰波那契数 2.1.1 算法原理 2.1.2 算法代码 2.1.3 空间优化原理——滚动数组 2.1.4 算法代码——空间优化版本 2.2 题二:三步问题 2.2.1 算法原理 2.2.2 算法代码 2.3 题二&a…

unix中的vfork函数

一、前言 本文介绍unix中的vfork函数,vfork函数功能和fork函数类似,也是用于创建新的进程,只不过调用vfork函数创建的子进程将共享父进程的进程空间,且只有当子进程调用exec()或者exit()函数后,父进程才会继续运行。 …

vscode【实用插件】Notes 便捷做笔记

安装 在 vscode 插件市场的搜索 Notes点 安装 安装成功后,vscode 左侧栏会出现 使用 初次使用 需先选择一个本地目录 重启 vscode 后,得到 切换笔记目录 新建笔记 快捷键为 Alt N 默认会创建 .md 文件 配合插件 Markdown Preview Enhanced 预览 .md…

Spring Boot 学习之路 -- Service 层

前言 最近因为业务需要,被拉去研究后端的项目,代码框架基于 Spring Boot,对我来说完全小白,需要重新学习研究…出于个人习惯,会以 Blog 文章的方式做一些记录,文章内容基本来源于「 Spring Boot 从入门到精…

四非人的保研之路,2024(2025届)四非计算机的保研经验分享(西南交通、苏大nlp、西电、北邮、山软、山计、电科、厦大等)

文章目录 一、个人背景二、夏令营北京邮电大学CS西南交通大学CS深圳大学CS苏州大学NLP南开大学CS 三、预推免北京邮电大学CS华东师范大学 CS和大数据电子科技大学 CS东北大学 CS厦门大学 信息学院山东大学 CS和SE西安电子科技大学 CS 四、个人经验五、上岸 一、个人背景 学校专…

Temu、亚马逊如何建立稳固的测评系统、避免挂单?

在跨境电商的测评与补单过程中,许多卖家和测评工作室常常面临由于技术环境不足导致的下单成功率低的问题。尤其是新账号在首次下单时,往往会遇到F号或砍单的困扰,进而陷入频繁购买和账号损失的恶性循环。这不仅消耗了大量时间和精力&#xff…

【Golang】关于Go语言字符串转换strconv

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…