必须指定 Spring Security authenticationmanager - 用于自定义过滤器

Posted

技术标签:

【中文标题】必须指定 Spring Security authenticationmanager - 用于自定义过滤器【英文标题】:Spring Security authenticationmanager must be specified - for custom filter 【发布时间】:2016-03-17 23:24:33 【问题描述】:

我正在尝试创建自定义用户名密码身份验证过滤器,因为我需要验证来自两个不同来源的密码。我正在使用 Spring Boot 1.2.1 和 Java 配置。我在部署时遇到的错误是

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customUsernamePasswordAuthenticationFilter' defined in file [/Users/rjmilitante/Documents/eclipse-workspace/login-service/bin/com/elsevier/eols/loginservice/CustomUsernamePasswordAuthenticationFilter.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: authenticationManager must be specified
…
Caused by: java.lang.IllegalArgumentException: authenticationManager must be specified

我不确定我错过了什么。我一直在尝试在我的 SecurityConfig 中为此过滤器设置 authenticationManager。我的代码看起来像

我的过滤器:

@Component
public class CustomUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter 

    public CustomUsernamePasswordAuthenticationFilter(RequestMatcher requiresAuthenticationRequestMatcher) 
        super(requiresAuthenticationRequestMatcher);
        // TODO Auto-generated constructor stub
    

    public CustomUsernamePasswordAuthenticationFilter() 
        super(new AntPathRequestMatcher("/login","POST"));
        // TODO Auto-generated constructor stub
    

    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException 
        // String dbValue = request.getParameter("dbParam");
        // request.getSession().setAttribute("dbValue", dbValue);
        System.out.println("attempting to authentificate");
        while (request.getAttributeNames().hasMoreElements()) 
            String e = (String) request.getAttributeNames().nextElement();
            System.out.println("param name : " + e + " and param value : " + request.getAttribute(e));
        
        return null;
    

我的安全配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter

    @Bean
    public PasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    

    @Bean(name="loginService")
    public LoginService loginService()
        return new LoginServiceImpl();
    

    @Bean( name="myAuthenticationManager")
     @Override
     public AuthenticationManager authenticationManagerBean() throws Exception 
         return super.authenticationManagerBean();
     

    @Bean
    CustomUsernamePasswordAuthenticationFilter customUsernamePasswordAuthenticationFilter() throws Exception 
        CustomUsernamePasswordAuthenticationFilter customUsernamePasswordAuthenticationFilter = new CustomUsernamePasswordAuthenticationFilter();
        customUsernamePasswordAuthenticationFilter.setAuthenticationManager(authenticationManagerBean());
      return customUsernamePasswordAuthenticationFilter;
    


    @Autowired
    private myAuthenticationProvider myAuthenticationProvider;

    protected void configure(HttpSecurity http) throws Exception 
        http.csrf().disable()
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        /*.addFilterBefore(customUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)*/;

    

    public void configure(AuthenticationManagerBuilder auth)  throws Exception 

        auth.authenticationProvider(myAuthenticationProvider);
        

有人可以看看吗?不知道怎么回事。

【问题讨论】:

【参考方案1】:

AbstractAuthenticationProcessingFilter 的 documentation 声明您必须设置 AuthenticationManager

我建议您尝试在 CustomUsernamePasswordAuthenticationFilter 类中添加以下代码:

@Override
@Autowired
public void setAuthenticationManager(AuthenticationManager authenticationManager) 
    super.setAuthenticationManager(authenticationManager);

【讨论】:

【参考方案2】:

我实际上已经克服了错误。我只需要从我的自定义过滤器中删除 @Component 注释。

【讨论】:

太棒了。非常感谢! 谁能解释一下为什么会这样??

以上是关于必须指定 Spring Security authenticationmanager - 用于自定义过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:配置(AuthenticationManagerBuilder auth)

Spring Security:配置(AuthenticationManagerBuilder auth)

手动设置spring security auth记住我

Spring Security:配置(AuthenticationManagerBuilder auth)与 authenticationManagerBean()

Spring Security 配置:Basic Auth + Spring Cloud Gateway

spring security 和auth2.0的区别