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);
}
}
io farò sapere se funziona. Grazie. –
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. –
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