spring-security - 从 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..
我跟踪了代码,发现:
- xml 配置使用SecurityFilters.java导致 SecurityContextPersistenceFilter 排在第一位。
- 使用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>
解决方案
推荐阅读
- java - 第一个连接org.hibernate.exception.JDBCConnectionException:无法获取JDBC Connection
- apache-kafka - 向 kafka 流状态存储中断添加名称
- excel - 从某个索引处的单元格中提取子字符串(不同的行长,多行)
- php - 无法验证 Slack 对话框字段。response_url 调用总是失败
- c# - 如何在 c# 中显示 sldocument 的“保存”对话框?
- python - 无法在 pycharm 中运行 jupyter
- c# - 基于 jti 声明而不是过期时间的 JWT 重放验证
- android - 谷歌安卓导入类文件的问题
- html - 让可访问的用户知道父容器有一个新的“当前”子容器
- properties - 消息:未定义的属性:stdClass::$num_rows