2012-03-20 1 views
31

Ho i seguenti bean definito:Qual è l'AuthenticationManager di default in Spring-Security? Come si autentica?

<sec:authentication-manager alias="authenticationManager"> 
    <sec:authentication-provider 
     user-service-ref="userDetailsService" /> 
</sec:authentication-manager> 

Credo che qui Spring usa un po 'di implementazione predefinita di AuthenticationManager.

Nel mio codice Java ho:

@Resource(name = "authenticationManager") 
private AuthenticationManager authenticationManager; // specific for Spring Security 

public boolean login(String username, String password) { 
    try { 
     Authentication authenticate = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password)); 
     if (authenticate.isAuthenticated()) { 
      SecurityContextHolder.getContext().setAuthentication(authenticate);    
      return true; 
     } 
    } 
    catch (AuthenticationException e) {   
    } 
    return false; 
} 

Qui AuthenticationManager.authenticate(...) si chiama. Ma vorrei sapere quale implementazione di AuthenticationManager Spring utilizza per impostazione predefinita e cosa fa il suo authenticate(...) per autenticare (ad esempio, assicurarsi che il nome utente corrisponda alla password).

Potresti spiegarlo?

risposta

39

Il AuthenticationManager è in realtà solo un contenitore per i provider di autenticazione, offrendo un'interfaccia coerente a tutti. Nei casi nella maggior parte dei casi, il valore predefinito AuthenticationManager è più che sufficiente.

Quando si chiama

.authenticate(new UsernamePasswordAuthenticationToken(username, password))` 

sta passando il UsernamePasswordAuthenticationToken al default AuthenticationProvider, che utilizzerà il userDetailsService per ottenere l'utente in base a nome utente e confrontarlo con la password dell'utente con quello del token di autenticazione.

In generale, il AuthenticationManager passa una sorta di AuthenticationToken a ciascuno di esso è AuthenticationProviders e ciascuno controllarla e, se possono utilizzare per l'autenticazione, tornano con l'indicazione di "autenticato", "autenticato", oppure "Impossibile autenticare" (che indica che il provider non sapeva come gestire il token, quindi ha trasmesso l'elaborazione)

Questo è il meccanismo che consente di collegare altri schemi di autenticazione, come l'autenticazione con un LDAP o Server Active Directory o OpenID ed è uno dei principali punti di estensione all'interno del framework Spring Security.

navi
+2

questo non risponde alla parte più concreta della domanda: "qual è il nome dell'implementazione predefinita dell'interfaccia' AuthenticationManager'? " Mentre la risposta di @ Ralph sotto fa. ('org.springframework.security.authentication.ProviderManager') –

+2

Dato che c'è solo 1 vero' AuthenticationManager', mi sono concentrato sulla questione della domanda, che è "cosa fa 'authenticate' do?", che richiede qualche background su come La primavera è messa insieme. In generale, ho trovato che, una risposta ricca che copre lo sfondo che sta guidando la domanda è più utile di rispondere a una domanda specifica. – cdeszaq

20

Primavera di sicurezza solo vero AuthenticationManager implementazione:

org.springframework.security.authentication.ProviderManager 

Questo utilizza diversi AuthenticationProvider per i compiti di autenticazione

Il AuthenticationManagerBeanDefinitionParser è responsabile per analizzare <sec:authentication-manager> i suoi stati java doc:

Registra il ProviderManager centrale utilizzato dallo spazio dei nomi configurazione, e consente la configurazione di un alias, consentendo agli utenti di di fare riferimento a esso nei loro bean e vedere chiaramente da dove proviene il nome .

Crea lo ProviderManager e aggiunge le specifiche fornite. Se nessuna offerta è specificata in xml, aggiunge un NullAuthenticationProvider. Questo è almeno un provider che non fa altro che prevenire le eccezioni di configurazione.

+0

Questa è la risposta corretta. – smeeb