【发布时间】:2014-12-22 20:59:41
【问题描述】:
在 spring 安全过滤器链中配置一些自定义过滤器时,我遇到了各种各样的笑声。主要问题围绕自定义 AbstractAuthenticationProcessingFilter。此过滤器需要 AuthenticationManager 以及 SessionAuthenticationStrategy。使用适配器:
@Override
protected void configure(HttpSecurity http) throws Exception {
....
AbstractAuthenticationProcessingFilter processingFilter = new MyAuthenticationProcessingFilter();
processingFilter.setAuthenticationManager(authenticationManager());
processingFilter.setSessionAuthenticationStrategy(http.getSharedObject(SessionFixationProtectionStrategy.class));
http.addFilterBefore(processingFilter, UsernamePasswordAuthenticationFilter.class);
首先,我遇到了 authenticationManager() 返回 null 的问题。跟踪它表明,在适配器的创建/初始化期间,特别是调用 getHttp() 的 WebSecurity.init() 方法,此代码最终调用 AuthenticationManagerBuilder.build(),它在 performBuild() 处返回 null
if(!isConfigured()) {
logger.debug("No authenticationProviders and no parentAuthenticationManager defined. Returning null.");
return null;
}
遗憾的是,这会将 AuthenticationManager 标记为已初始化(为 null)并永远返回错误的结果。所有这一切都在它到达我的适配器代码之前!我终于发现我可以使用 authenticationManagerBean() 代替。
但我还需要设置 sessionAuthenticationStrategy。可悲的是,此时这也是空的。我注意到“标准”过滤器都使用“配置器”来设置它们,显然此时所有的 bean 都已正确定义。但是我还没有弄清楚如何直接注册我的“配置器”而不是我的过滤器。
那么.. 如何构建一个自定义的 AuthenticationProcessingFilter 并在 java 配置适配器中定义所需的属性?
【问题讨论】:
-
PS,我想我已经通过 SessionManagementConfigurer
sessionManagementConfigurer = http.sessionManagement().sessionFixation().newSession() 设置了 SessionFixationStrategy,但这似乎还不够。
标签: spring-security