如何连接AuthenticationManager for Spring AbstractPreAuthenticatedProcessingFilter

时间:2015-09-29 19:10:48

标签: spring-mvc spring-security autowired

我的Spring安全过滤器链中有一个派生自AbstractPreAuthenticatedProcessingFilter的类。此过滤器的目的是将企业身份验证服务留在特定Principal对象中的角色数据按到Collection中,以便SpringSecurity可以使用它们。

但是,我无法通过此例外:

Caused by: java.lang.IllegalArgumentException: An AuthenticationManager must be set
        at org.springframework.util.Assert.notNull(Assert.java:112) ~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE]
        at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.afterPropertiesSet(AbstractPreAuthenticatedProcessingFilter.java:97) ~[spring-security-web-4.0.1.RELEASE.jar:4.0.1.RELEASE]

我使用的是Java配置,而不是XML配置。我的代码遵循How To Inject AuthenticationManager using Java Configuration in a Custom Filter的示例如下:

  1. 安全配置器适配器

    @Configuration
    @EnableWebSecurity
    public class MyWebSecurityAdaptor extends WebSecurityConfigurerAdapter {
    
        ...
        @Bean(name = "myAuthenticationManager")
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
    }
    
  2. 过滤器类本身:

    @Component
    public class MyPreauthFilter extends AbstractPreAuthenticatedProcessingFilter {
    
    
            ...
        @Autowired
        @Override
        public void setAuthenticationManager(AuthenticationManager authenticationManager) {
            super.setAuthenticationManager(authenticationManager);
        }   
    }
    
  3. 如果不是上面第1项中的代码,我会尝试以下方法:

        @Autowired
        @Override
        protected AuthenticationManager authenticationManager() throws Exception   
    {
            // TODO Auto-generated method stub
            return super.authenticationManager();
        }
    

    然后错误发生变化。

    然后变成:

      

    引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到类型为[org.springframework.security.authentication.AuthenticationManager]的限定bean依赖:预期至少有1个bean有资格作为autowire candidate}

    我想这是有道理的,这种方式不会定义bean。但那么为什么DID定义bean的原始方式失败了呢?

1 个答案:

答案 0 :(得分:1)

而不是添加' myAuthernticationManager'到WebSecurityConfigurerAdapter类。将它直接添加到过滤器类并自动装配它。

@Autowired
@Override
public void setMyAuthenticationManager(MyAuthenticationManager myAuthenticationManager) {
    this.myAuthenticationManager  = myAuthenticationManager;
    super.setAuthenticationManager(this.myAuthenticationManager);
}

从WebSecurityConfigurerAdapter中删除与myAuthenticationManager相关的所有代码。