2013-08-13 26 views
16

So che questo è stato risposto così tante volte, ma sono confuso. Ho già un meccanismo di autenticazione nella mia applicazione e voglio solo usare la parte di autorizzazione di Spring MVC. Sto utilizzando Spring MVC 3 e Spring Security 3.Come implementare l'autenticazione personalizzata in Spring Security 3?

Quando eseguo una ricerca su Internet, ho trovato due soluzioni, la prima è l'implementazione dell'interfaccia AuthenticationProvider. Example1. Il secondo è quello di implementare UserDetails e UserDetailsService, Example2 quindi sono perso qui.

---- ---- Aggiornamento

La seconda parte della domanda è here. E la soluzione alla soluzione alternativa.

risposta

37

Nella maggior parte dei casi quando si utilizzano solo nomi utente e password per l'autenticazione e i ruoli per l'autorizzazione, è sufficiente implementare il proprio UserDetailsService.

Il flusso di autenticazione username password è quindi generalmente come segue:

  • Un filtro di protezione molla (autenticazione/forma base/..) preleva il nome utente e password, si trasforma in un oggetto UsernamePasswordAuthentication e lo passa al AuthenticationManager
  • Authentication Manager cerca un fornitore candidato in grado di gestire UsernamePasswordtokens, che in questo caso è il DaoAuthenticationProvider e passa il token per l'autenticazione lungo
  • il provider di autenticazione richiama il metodo loadUse rByUsername interface e genera un'eccezione UsernameNotFound se l'utente non è presente o restituisce un oggetto UserDetails, che contiene nome utente, password e autorità.
  • Il provider di autenticazione confronta quindi le password dell'oggetto UsernamePasswordToken e UserDetails fornito. (può anche gestire gli hash delle password tramite PasswordEncoders) Se non corrisponde, l'autenticazione fallisce. Se corrisponde, registra l'oggetto dei dettagli dell'utente e lo passa a AccessDecisionManager, che esegue la parte Autorizzazione.

Quindi, se la verifica nel DaoAuthenticationProvider soddisfa le vostre esigenze. Quindi dovrai solo implementare il tuo UserDetailsService e modificare la verifica del DaoAuthenticationProvider.

Un esempio per l'utilizzo UserDetailsService primavera 3.1 è la seguente: XML

Primavera:

<security:authentication-manager> 
    <security:authentication-provider user-service-ref="myUserDetailsService" /> 
</security:authentication-manager> 

<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" /> 

UserDetailsService Implementazione:

public MyUserDetailsService implements UserDetailsService { 

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
    //Retrieve the user from wherever you store it, e.g. a database 
    MyUserClass user = ...; 
    if (user == null) { 
     throw new UsernameNotFoundException("Invalid username/password."); 
    } 
    Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3"); 
    return new User(user.getUsername(), user.getPassword(), authorities); 
} 

} 
+0

io farò sapere se funziona. Grazie. –

+0

In questo modo non posso personalizzare il flusso di lavoro di accesso. Diciamo che voglio bloccare l'utente al quinto tentativo o inviare un'e-mail. Questo è ciò che sto cercando. –

+0

Il mio suggerimento sarebbe quello di creare una sottoclasse di DAOAuthenticationManager, sovrascrivere il metodo di autenticazione e semplicemente invocare super.authenticate in un try catch. – Nils

Problemi correlati