我已经在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()
返回nullif(!isConfigured()) {
logger.debug("No authenticationProviders and no parentAuthenticationManager defined. Returning null.");
return null;
}
可悲的是,这会将AuthenticationManager标记为已初始化(为null)并永远返回错误的结果..所有这一切在它甚至到达我的适配器代码之前!我终于想通了我可以使用authenticationManagerBean()。
但我还需要设置sessionAuthenticationStrategy。可悲的是,目前这也是空的。我注意到了这个标准'过滤器都使用'配置器'设置它们,显然到了这个时候,所有的bean都被正确定义了。但我还没弄明白如何注册我的配置器'而不是我的过滤器。
那么..如何使用java配置适配器中定义的必需属性构建自定义AuthenticationProcessingFilter?
答案 0 :(得分:1)
好吧,我想出了如何为我的自定义过滤器设置配置器。 HttpSecurity.apply()接受一个配置器,你可以在WebSecurityConfigurerAdapter.configure(http)方法中调用它。原来试图在那时设置过滤器可能是一个坏主意..至少过滤器依赖于安全基础设施的其他部分。
在configurer中,使用init(http)和configure(http)创建和添加安全过滤器。在调用配置程序时,已经定义了许多共享对象并将其插入http,例如AuthenticationManager和SessionAuthenticationStrategy实例。