2014-10-10 4 views
9

che uso:primavera-security java config: come configurare le istanze multiple AuthenticationManager

  • avvio di primavera: 1.1.7
  • primavera-sicurezza: 4.0.0.M2
  • primavera-FMK: 4.1 .1.RELEASE

tutto è configurato con Java Config (compresi primavera-sicurezza)

sto lavorando su un server web p roject where Authentication: l'intestazione Basic64Gibberish di base viene utilizzata per autenticare gli utenti.

Il problema è che a seconda della URI del AuthenticationManager è diverso (perché ho bisogno di 2 differenti UserDetailsService.

  • /URI1/** => authManager1
  • /URI2/** => authManager2

ho provato più estensioni di WebSecurityConfigurerAdapter con

@Override 
@Bean(name = "authManager1") 
public AuthenticationManager authenticationManagerBean() throws Exception 
@Override 
@Bean(name = "authManager2") 
public AuthenticationManager authenticationManagerBean() throws Exception 

inutilmente

ho sempre ottenere:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' 
defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Instantiation of bean failed; 
nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: 
Factory method [public javax.servlet.Filter org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration.springSecurityFilterChain() throws java.lang.Exception] 
threw exception; nested exception is java.lang.IllegalArgumentException: 
Expecting to only find a single bean for type interface org.springframework.security.authentication.AuthenticationManager, 
but found [authManager1, authManager2] 

Dal momento che ho più catene di filtri di sicurezza come posso "raccontare" la primavera-sicurezza per iniettare AuthenticationManager diversi in diverse catene di filtri di sicurezza ?

Grazie in anticipo P.

risposta

11

è possibile avere più elementi di configurazione http, ciascuna con il proprio AuthenticationManager. Potrebbe sembrare così:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig { 

    @Bean 
    private AuthenticationManager authenticationManager1() { 
     // defines first AuthenticationManager 
     return authenticationManager; 
    } 

    @Bean 
    private AuthenticationManager authenticationManager2() { 
     // defines second AuthenticationManager 
     return authenticationManager; 
    } 

    @Configuration 
    @Order(1) 
    public static class Uri1ApiConfigurationAdapter extends WebSecurityConfigurerAdapter { 

     @Autowired 
     @Qualifier(authenticationManager1) 
     private authManager1; 

     @Override 
     protected AuthenticationManager authenticationManager() { 
      return authManager1; 
     } 

     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .antMatcher("/URI1/**") 
       ... 
     } 
    } 

    @Configuration 
    @Order(2) 
    public static class Uri2ApiConfigurationAdapter extends WebSecurityConfigurerAdapter { 

     @Autowired 
     @Qualifier(authenticationManager2) 
     private authManager2; 

     @Override 
     protected AuthenticationManager authenticationManager() { 
      return authManager2; 
     } 

     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .antMatcher("/URI2/**") 
       ... 
     } 
    } 
} 
+0

Grazie mille. Funziona. – paskos