【发布时间】:2015-09-20 17:36:27
【问题描述】:
当使用自定义自动配置的网络安全配置来自不同的项目和 Spring Cloud Eureka Server 时,我遇到了过滤器顺序问题。使用自定义自动配置的 Web 安全配置时,springSecurityFilterChain 出现在由 EurekaServerConfiguration 创建的 servletContainer 过滤器之后。因此,对 Eureka 仪表板的访问是安全的,但 /eureka/* 没有应用 Spring Security 过滤器链。
如果我使用默认的 Spring Boot 自动配置的 Web Security(即security.basic.* 属性,过滤顺序是正确的。
如果我在相同的项目和不同的配置类中使用创建自定义网络安全配置作为发现服务器,则过滤器顺序是正确的。如果我使用 @EnableWebSecurity 注释主应用程序类或使用 @EnableWebSecurity 在主应用程序类中添加静态内部类,我也会得到错误的过滤器顺序。
我在网络安全配置的实施细节中错误地提供了自动配置或遗漏了什么?
包含完整示例的存储库:Eureka Security Config Examples
设置
模块 - 我的自动配置
@Configuration
@AutoConfigureBefore(SecurityAutoConfiguration.class)
@ConditionalOnClass(EnableWebSecurity.class)
public class CustomSecurityConfiguration {
@Configuration
@EnableWebSecurity
public static class WebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
}
此项目包含一个带有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);
}
}
过滤顺序 - 预期(在发现服务器项目中使用 Spring Boot 基本安全或自定义安全时)
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 [/]
【问题讨论】:
标签: spring-security spring-boot spring-cloud