Spring Security中自定义cors配置

news/2024/9/30 10:29:17 标签: java, spring

一、为什么要自定义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">    @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。

三、自定义配置

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


http://www.niftyadmin.cn/n/5684900.html

相关文章

信息技术与商业变革:机遇与挑战

信息技术与商业变革:机遇与挑战 目录 引言信息技术推动商业变革的主要因素 数字化转型的加速客户需求的个性化创新技术的应用 信息技术在企业中的应用场景 供应链管理的智能化营销与客户关系管理财务与资源管理的自动化远程工作和协作 信息技术带来的挑战 网络安全…

小型气象站在线分析

小型气象站在线分析 气象站是进行气象观测的场所。 一、气象站的主要功能 气象数据监测 气象站通过各种仪器设备对气温、气压、湿度、风向、风速、降水量等气象要素进行实时监测。这些数据对于天气预报、气候研究、灾害预警等。 例如,准确的气温和湿度数据可以帮助…

./mnt/container_run_medium.sh

#!/bin/bash# 清理旧的日志文件 rm -f *.log rm -f nohup.out rm -f cssd.dat# 启动 pwbox_simu 和 MediumBoxBase nohup /mnt/simutools/pwbox_simu /mnt/simutools/pw_box.conf > /dev/null 2>&1 & nohup /mnt/mediumSimu/MediumBoxBase /mnt/mediumSimu/hynn_…

每一个云手机的ip是独立的吗

每一个云手机的IP地址通常是独立的。以下是关于云手机IP地址的一些详细信息: 1. 云手机的概念 云手机是将手机操作系统(如Android)虚拟化后托管在云服务器上的一种服务。用户可以通过互联网访问和控制这些云手机,进行应用使用、…

水波荡漾效果+渲染顺序+简单UI绘制

创建场景及布置 创建新场景Main,在Main场景中创建一个plane物体,命名为WaterWavePla,具体数值及层级面板排布如下: 编写脚本 创建一个文件夹,用于存放脚本,命名Scripts,创建一个子文件夹Effect,存放特效相关脚本,创建…

Hive数仓操作(二)

Hive 数据类型与连接 Hive 是一个用于处理大规模数据集的工具,支持多种数据类型以满足不同的需求。本文将详细介绍 Hive 的基本数据类型和集合数据类型。 一、Hive 基本数据类型 Hive 提供了多种基本数据类型,适用于不同的数据存储和处理需求&#xf…

java socket bio 改造为 netty nio

公司早些时候接入一款健康监测设备,由于业务原因近日把端口暴露在公网后,每当被恶意连接时系统会创建大量线程,在排查问题是发现是使用了厂家提供的服务端demo代码,在代码中使用的是java 原生socket,在发现连接后使用独…

[Docker学习笔记]Docker的原理Docker常见命令

文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …