2016-08-31 19 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 ... 
}