Spring security Spring Cloud Eureka服务器&x2B;自定义自动配置的Web安全性
当使用来自不同项目的自定义自动配置web安全配置以及Spring Cloud Eureka Server时,我遇到了过滤器顺序问题。使用自定义自动配置的web安全配置时,Spring security Spring Cloud Eureka服务器&x2B;自定义自动配置的Web安全性,spring-security,spring-boot,spring-cloud,Spring Security,Spring Boot,Spring Cloud,当使用来自不同项目的自定义自动配置web安全配置以及Spring Cloud Eureka Server时,我遇到了过滤器顺序问题。使用自定义自动配置的web安全配置时,springSecurityFilterChain出现在由EurekaServerConfiguration创建的servletContainer过滤器之后。因此,对Eureka仪表板的访问是安全的,但是/Eureka/*没有应用Spring安全过滤器链 如果使用默认的Spring Boot自动配置的Web安全性(即Securi
springSecurityFilterChain
出现在由EurekaServerConfiguration
创建的servletContainer
过滤器之后。因此,对Eureka仪表板的访问是安全的,但是/Eureka/*
没有应用Spring安全过滤器链
如果使用默认的Spring Boot自动配置的Web安全性(即Security.basic.*
properties),则过滤器顺序是正确的
如果我在发现服务器所在的同一项目中创建自定义web安全配置,并在不同的配置类中创建自定义web安全配置,则筛选顺序是正确的。如果我使用@EnableWebSecurity
注释主应用程序类,或者使用spring.factories
文件的META-INF文件夹
并且在EnableAutoConfiguration
键下添加了相应的类。我已经通过-Ddebug
验证了该类是正匹配的
模块-发现服务器
我将上述模块作为依赖项以及spring boot starter security
包括在内
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServerApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryServerApplication.class, args);
}
}
筛选器顺序-预期(在discovery server项目中使用Spring Boot基本安全性或自定义安全性时)
筛选顺序-结果(自定义自动配置的web安全性)
这里的问题是,当您使用
@EnableWebSecurity
注释时,它会在SpringBootWebSecurityConfiguration
中禁用Spring Boot提供的安全性自动配置(请参阅)
使用@EnableWebSecurity
时,springSecurityFilterChain
bean在WebSecurityConfiguration
中实例化。由于此bean是一个普通的过滤器
,因此它没有顺序
。使用SpringBootWebSecurityConfiguration
提供的自动配置时, springSecurityFilterChain
bean包装在FilterRegistrationBean
中,其顺序可以在配置文件中指定,或者默认值为0
(有关更多详细信息,请参阅)
当使用Spring Boot时,它会在将过滤器连接到容器之前尝试获取其顺序。当使用@EnableWebSecurity
时,由于springSecurityFilterChain
bean没有顺序,它将获得Ordered的默认值。类OrderComparator
中优先级最低的
。这是EurekaServerConfiguration
中定义的jersey
bean的相同值,负责调用/eureka
前缀。在eureka的引导阶段,在无序的springSecurityFilterChain
之前实例化jersey
bean,并在filte之前连接r链,从而禁用/eureka
前缀上的安全性
要解决此问题,只需添加一个FilterRegistrationBean
将springSecurityChain
bean包装在配置类中,并用@EnableWebSecurity
注释:
@Bean
@ConditionalOnBean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public FilterRegistrationBean securityFilterChainRegistration(@Qualifier(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) Filter securityFilter)
{
FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
registration.setOrder(SecurityProperties.DEFAULT_FILTER_ORDER);
registration.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
return registration;
}
我在这里设置了0
的默认顺序,您可以像在SpringBootWebSecurityConfiguration
中一样对其进行配置。这将使springSecurityChain
bean看起来像是自动配置的
Mapping filter: 'metricFilter' to: [/*]
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping filter: 'webRequestTraceFilter' to: [/*]
Mapping filter: 'servletContainer' to urls: [/eureka/*]
Mapping filter: 'applicationContextIdFilter' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]
Mapping filter: 'metricFilter' to: [/*]
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
Mapping filter: 'webRequestTraceFilter' to: [/*]
Mapping filter: 'servletContainer' to urls: [/eureka/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping filter: 'applicationContextIdFilter' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]
@Bean
@ConditionalOnBean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public FilterRegistrationBean securityFilterChainRegistration(@Qualifier(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) Filter securityFilter)
{
FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
registration.setOrder(SecurityProperties.DEFAULT_FILTER_ORDER);
registration.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
return registration;
}