首页 > 解决方案 > 从 xml 迁移到 java 配置会改变过滤器链中过滤器的顺序

问题描述

我将 spring security 移动到 java 配置下面是一个示例代码。但是,在调试过滤器链时,我注意到前 2 个过滤器的顺序是相反的。我正在使用 Spring Security 版本 5.5.1 并在 web.xml 中使用 org.springframework.web.context.ContextLoaderListener 来加载配置。

使用(xml)配置时

 size = 12
 0 = SecurityContextPersistenceFilter
 1 = WebAsyncManagerIntegrationFilter
 2 = HeaderWriterFilter
etc... 

使用(java)配置时

 0 = WebAsyncManagerIntegrationFilter
 1 = SecurityContextPersistenceFilter
 2 = HeaderWriterFilter
etc..

我跟踪了代码,发现:

  1. xml 配置使用SecurityFilters.java导致 SecurityContextPersistenceFilter 排在第一位。
  2. 使用FilterOrderRegistration.java的java 配置导致 WebAsyncManagerIntegrationFilter 排名第一。

我不确定这是否是预期的行为。根据 spring 安全文档WebAsyncManagerIntegrationFilter 应该排在第一位。我不确定我应该手动反转订单还是保留?或者,如果改变秩序会产生看不见的后果?

java配置示例

@Configuration
@EnableWebSecurity
public class FormApplication extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http    
                .csrf().disable()
                .exceptionHandling()
                    .authenticationEntryPoint(loginEntryPoint())
                .and()
                .authorizeRequests()
                    .antMatchers("/myapp").fullyAuthenticated() 
                .and()
                .formLogin()
                    .loginPage("/login.html")
                    .failureHandler(loginFailureHandler())
                    .defaultSuccessUrl("/myapp/home.html")
                    .usernameParameter("username")
                    .passwordParameter("password")
                    .loginProcessingUrl("/formsubmit").permitAll()
                .and()
                .sessionManagement()
                    .sessionFixation().migrateSession()
                .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/logout.html");

    }

    @Override
    protected AuthenticationManager authenticationManager() throws Exception {
        return authenticationManager();
    }

}

xml配置示例

<security:http entry-point-ref="loginEntryPoint" use-expressions="true">

  <security:intercept-url pattern='/myapp/**' access='isRememberMe() or isAuthenticated()'/>  

  <security:form-login login-page="/login.html"
                         authentication-failure-handler-ref="loginFailureHandler"
                         default-target-url="/myapp/home.html"
                         username-parameter="username"
                         password-parameter="password"
                         login-processing-url="/formsubmit"

    <security:logout logout-url="/logout" logout-success-url="/logout.html"/>

    <security:session-management session-fixation-protection="migrateSession"/>

    <security:csrf disabled="true"/>
</security:http>

标签: spring-security

解决方案


推荐阅读