2016-08-31 65 views
3

我有弹簧安全配置与SPNEGO正在“与黑客”工作。它看起来如下:WebSecurityConfigurerAdapter与自定义身份验证过滤器 - 依赖性问题

@Configuration 
@EnableWebSecurity 
public class SpnegoConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       ... 
       .addFilterBefore(
         spnegoAuthenticationProcessingFilter(authenticationManagerBean()), 
         BasicAuthenticationFilter.class); // 1 
    } 

    @Override 
    @Autowired // 3 
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth 
       .authenticationProvider(kerberosAuthenticationProvider()) 
       .authenticationProvider(kerberosServiceAuthenticationProvider()); 
    } 


    @Bean 
    public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter(
      AuthenticationManager authenticationManager) { // 2 
     SpnegoAuthenticationProcessingFilter filter = 
       new SpnegoAuthenticationProcessingFilter(); 
     filter.setAuthenticationManager(authenticationManager); 
     return filter; 
    } 
    ... 
} 

正在发生的事情:

  • 我需要添加spnegoAuthenticationProcessingFilter(1)
  • 这个过滤器对的AuthenticationManager的依赖(2)
  • 我需要添加认证提供者(3)

点在这个类是WebSecurityConfigurerAdapter我ove rriding 2种方法:

  1. configure(HttpSecurity http) - 这对通过自定义过滤器已经内置AuthenticationManager依赖
  2. configure(AuthenticationManagerBuilder auth) - 这显然涉及对AuthenticationManager没有正在修建,但 - 我们正在建设它

如果在方法(3)上我没有@AutowiredAuthenticationManager内置得太早,我添加的AuthenticationProvider s不起作用。身份验证失败,但没有合适的AuthenticationProvider

随着@Autowired到位,它的工作原理,但如果感觉不对。我甚至不知道为什么它开始工作。

请教正确的方法。

编辑:它实际上没有@Autowired工作。但重点在于接受的答案。如果您依赖@Configuration中的AuthenticationManager,请确保它是通过authenticationManagerBean()方法暴露或引用的。

回答

2

您使用了错误的AuthenticationManager

如果你想从SpnegoConfig依赖注入使用AuthenticationManager,你要揭露它,请参阅JavaDoc

覆盖此方法来从配置(AuthenticationManagerBuilder)暴露的AuthenticationManager被曝光为一个Bean 。例如:

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

如果要配置全局AuthenticationManager,你必须自动装配的AuthenticationMangerBuilder,看到Spring Security 3.2.0.RC2 Released

例如,如果要配置全局认证(即你只有一个AuthenticationManager)应该自动装入AuthenticationMangerBuilder:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) { 
    // ... configure it ... 
}