【问题标题】:Configuring a filter within a WebSecurityConfigurerAdapter在 WebSecurityConfigurerAdapter 中配置过滤器
【发布时间】: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


【解决方案1】:

好吧,我想出了如何为我的自定义过滤器设置配置器。 HttpSecurity.apply() 采用一个配置器,您可以在 WebSecurityConfigurerAdapter.configure(http) 方法期间调用它。事实证明,当时尝试设置过滤器可能是个坏主意。至少过滤器依赖于安全基础架构的其他部分。

在您的配置器中,使用 init(http) 和 configure(http) 创建并添加一个安全过滤器。在调用配置器时,已经定义了许多共享对象并将其插入 http,例如 AuthenticationManager 和 SessionAuthenticationStrategy 实例。

【讨论】:

  • 我意识到你发布这个已经有一段时间了,但我正在尝试类似的东西,但我很难弄清楚如何“设置配置器”。你用了什么类或接口?内置配置器毫无价值,因为它们都是用 extends AbstractHttpConfigurer 定义的,根据文档,“仅供内部使用”。
  • 如果我没记错的话,您使用的是配置器适配器:例如 WebMvcConfigurerAdapter
猜你喜欢
  • 2016-01-15
  • 2018-02-14
  • 2015-05-27
  • 2012-07-28
  • 2015-12-13
  • 2018-02-02
  • 2016-07-13
  • 2014-09-24
相关资源
最近更新 更多