2016-08-31 3 views
3

Ich habe Spring Security-Konfiguration mit SPNEGO, die "mit einem Hack" arbeitet. Es sieht aus wie folgt:WebSecurityConfiguratorAdapter mit benutzerdefinierten Authentifizierungsfilter - Abhängigkeitsproblem

@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; 
    } 
    ... 
} 

Was geschieht:

  • I spnegoAuthenticationProcessingFilter (1)
  • Dieser Filter hat die Abhängigkeit von AuthenticationManager (2)
  • Ich brauche Authentifizierung hinzufügen hinzufügen müssen providers (3)

Punkt in dieser Klasse zu sein, die WebSecurityConfigurerAdapter ist Ich bin Ove rriding 2 Methoden:

  1. configure(HttpSecurity http) - diese Abhängigkeit von der bereits AuthenticationManager durch benutzerdefinierte Filter eingebaut hat
  2. configure(AuthenticationManagerBuilder auth) - dies bezieht sich eindeutig auf AuthenticationManager noch gebaut keine ist - wir Gebäude sind

Wenn Ich habe nicht die @Autowired auf Methode (3) die ist zu früh gebaut und meine Zugabe von AuthenticationProvider s hat keine Wirkung. Die Authentifizierung schlägt fehl, mit Ausnahme gibt es keine geeigneten AuthenticationProvider.

Mit der @Autowired an Ort und Stelle funktioniert es aber wenn es sich falsch anfühlt. Ich bin mir nicht einmal sicher, warum es dann funktioniert.

Bitte beachten Sie die richtige Vorgehensweise.

Edit: Es funktioniert tatsächlich ohne die @ Autowired. Aber der Punkt ist in der akzeptierten Antwort. Wenn Sie jemals auf in @Configuration angewiesen sind, stellen Sie sicher, dass es entweder ausgesetzt oder über die authenticationManagerBean()-Methode verwiesen wird.

Antwort

2

Sie verwenden das falsche AuthenticationManager.

Wenn Sie die AuthenticationManager von SpnegoConfig mit Dependency Injection verwenden möchten, haben Sie es zu belichten, siehe JavaDoc:

außer Kraft setzen diese Methode die AuthenticationManager von configure (AuthenticationManagerBuilder) zu belichten als Bean ausgesetzt werden . Zum Beispiel:

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

Wenn Sie globale AuthenticationManager konfigurieren möchten, müssen Sie die AuthenticationMangerBuilder autowire finden Spring Security 3.2.0.RC2 Released

Zum Beispiel, wenn Sie globale Authentifizierung konfigurieren möchten (dh Sie haben ein einzelner AuthenticationManager), sollten Sie den AuthenticationMangerBuilder automatisch ansteuern:

Verwandte Themen