Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring security Spring Cloud Eureka服务器&x2B;自定义自动配置的Web安全性_Spring Security_Spring Boot_Spring Cloud - Fatal编程技术网

Spring security Spring Cloud Eureka服务器&x2B;自定义自动配置的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

当使用来自不同项目的自定义自动配置web安全配置以及Spring Cloud Eureka Server时,我遇到了过滤器顺序问题。使用自定义自动配置的web安全配置时,
springSecurityFilterChain
出现在由
EurekaServerConfiguration
创建的
servletContainer
过滤器之后。因此,对Eureka仪表板的访问是安全的,但是
/Eureka/*
没有应用Spring安全过滤器链

如果使用默认的Spring Boot自动配置的Web安全性(即
Security.basic.*
properties),则过滤器顺序是正确的

如果我在发现服务器所在的同一项目中创建自定义web安全配置,并在不同的配置类中创建自定义web安全配置,则筛选顺序是正确的。如果我使用
@EnableWebSecurity
注释主应用程序类,或者使用在主应用程序类中添加静态内部类de>@EnableWebSecurity我还得到了错误的筛选顺序

我错误地提供了自动配置,或者在web安全配置的实现细节中遗漏了什么

包含完整示例的存储库:

设置

模块-我的自动配置 此项目包含带有
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;
}