2015-06-19 9 views
13

Sto configurando la mia applicazione web Spring Security (v4.0.1). Voglio avere due provider di autenticazione, uno "in-memory" per gestire l'account dell'amministratore e uno personalizzato che si riferisce alla mia implementazione. Il sistema dovrebbe tentare l'autenticazione con il provider "in-memory" prima di tutto e contro quello personalizzato al secondo posto. Il mio codice è simile al seguente:In memoria e fornitori personalizzati tutti insieme

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, 
    AuthenticationProvider provider) throws Exception { 
    auth.inMemoryAuthentication() 
      .withUser("admin") 
      .password("s3cr3t") 
      .authorities("ADMIN"); 
    auth.authenticationProvider(provider); 
} 

Tuttavia, questo codice guida il framework per provare prima la mia implementazione personalizzata. Ha un po 'di senso, dal momento che il metodo AuthenticationManagerBuilder#authenticationProvider aggiunge un Provider all'Elenco interno mentre lo AuthenticationManagerBuilder#inMemoryAuthentication lo configura internamente. Come potrei riuscire a farlo funzionare?

risposta

20

È possibile creare il InMemoryUserDetailsManagerConfigurer manualmente e dire che per configurarsi sul AuthenticationManagerBuilder quando hai finito di configurarlo in modo che installa il suo AuthenticationProvider prima che la vostra abitudine uno:

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth, 
     AuthenticationProvider provider) throws Exception { 

    inMemoryConfigurer() 
     .withUser("admin") 
      .password("s3cr3t") 
      .authorities("ADMIN") 
     .and() 
     .configure(auth); 
    auth.authenticationProvider(provider); 
} 

private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> 
     inMemoryConfigurer() { 
    return new InMemoryUserDetailsManagerConfigurer<>(); 
} 

Normalmente ciò che accade è che il InMemoryUserDetailsManagerConfigurer viene creato e aggiunto all'elenco dei configuratori da applicare quando viene creato il numero AuthenticationManager, ovvero dopo aver installato il tuo numero personalizzato AuthenticationProvider.

+0

Funziona sicuramente ;-) –

3

Più o meno da spring.io Documentation

Se si sta utilizzando la configurazione XML (ad esempio, la primavera-security.xml):

<security:authentication-manager> 
    <security:authentication-provider ref="FirstProvider" /> 
    <security:authentication-provider ref="SecondProvider" /> 
</security:authentication-manager> 

(sto usando che l'installazione di una delle primavera del built-in provider di autenticazione accanto a uno personalizzato, funziona bene)

Se si utilizza Java Config, posso solo fare riferimento al post di un'altra persona maclema on Java config for multiple authentication provider, poiché non ho mai (con successo) provato la configurazione del codice

+0

Grazie per la risposta, non sto utilizzando la configurazione XML. Quello che voglio ottenere è qualcosa di simile alla tua risposta collegata, ma invece di avere due provider di autenticazione personalizzati, ne ho uno personalizzato e uno in-memory, fornito da Spring. Poiché quello in memoria è definito su AuthenticationManagerBuilder, non so come aggiungerlo. –

Problemi correlati