Spring Security: autenticazione con un UserDetailsService supportato da database

1. Panoramica

In questo articolo, mostreremo come creare un UserDetailsService personalizzato supportato da database per l'autenticazione con Spring Security.

2. UserDetailsService

L' interfaccia UserDetailsService viene utilizzata per recuperare i dati relativi all'utente. Ha un metodo chiamato loadUserByUsername () che può essere sovrascritto per personalizzare il processo di ricerca dell'utente.

Viene utilizzato da DaoAuthenticationProvider per caricare i dettagli sull'utente durante l'autenticazione.

3. Il modello utente

Per memorizzare gli utenti, creeremo un'entità Utente che viene mappata su una tabella di database, con i seguenti attributi:

@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false, unique = true) private String username; private String password; // standard getters and setters }

4. Recupero di un utente

Allo scopo di recuperare un utente associato a un nome utente, creeremo una classe DAO utilizzando Spring Data estendendo l' interfaccia JpaRepository :

public interface UserRepository extends JpaRepository { User findByUsername(String username); }

5. UserDetailsService

Per fornire il nostro servizio utente, dobbiamo implementare l' interfaccia UserDetailsService .

Creeremo una classe chiamata MyUserDetailsService che sovrascrive il metodo loadUserByUsername () dell'interfaccia.

In questo metodo, recuperiamo l' oggetto User utilizzando DAO e, se esiste, lo avvolgiamo in un oggetto MyUserPrincipal , che implementa UserDetails e lo restituisce:

@Service public class MyUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException(username); } return new MyUserPrincipal(user); } }

Definiamo la classe MyUserPrincipal come segue:

public class MyUserPrincipal implements UserDetails { private User user; public MyUserPrincipal(User user) { this.user = user; } //... }

6. Configurazione della molla

Dimostreremo entrambi i tipi di configurazioni Spring: XML e basate su annotazioni, necessarie per utilizzare la nostra implementazione personalizzata UserDetailsService .

6.1. Configurazione dell'annotazione

Tutto ciò che dobbiamo fare per abilitare il nostro UserDetailsService personalizzato è aggiungerlo al contesto dell'applicazione come bean.

Poiché abbiamo configurato la nostra classe con l' annotazione @Service , l'applicazione la rileverà automaticamente durante la scansione dei componenti e creerà un bean fuori da questa classe. Pertanto, non c'è nient'altro che dobbiamo fare qui.

In alternativa possiamo:

  • configurarlo nel authenticationManager utilizzando il metodo AuthenticationManagerBuilder # userDetailsService
  • impostarlo come proprietà in un bean di autenticazione personalizzato , quindi iniettarlo utilizzando la funzione AuthenticationManagerBuilder # authenticationProvider

6.2. Configurazione XML

D'altra parte, per la configurazione XML dobbiamo definire un bean di tipo MyUserDetailsService e iniettarlo nel bean del provider di autenticazione di Spring :

7. Altre opzioni di autenticazione supportate da database

I AuthenticationManagerBuilder offre un altro metodo per l'autenticazione configurare JDBC-based nella nostra applicazione.

Dovremo configurare AuthenticationManagerBuilder.jdbcAuthentication con un'istanza DataSource . Se il nostro database segue lo schema utente Spring, le configurazioni predefinite ci andranno bene.

Abbiamo visto una configurazione di base utilizzando questo approccio in un post precedente.

L' entità JdbcUserDetailsManager risultante da questa configurazione implementa anche UserDetailsService .

Di conseguenza, possiamo concludere che questa configurazione è più facile da implementare, soprattutto se stiamo usando Spring Boot che configura automaticamente DataSource per noi.

Se abbiamo bisogno, comunque, di un livello più alto di flessibilità, personalizzando esattamente come l'applicazione recupererà i dettagli dell'utente, allora opteremo per l'approccio che abbiamo seguito in questo tutorial.

8. Conclusione

Per riassumere, in questo articolo abbiamo mostrato come creare un UserDetailsService personalizzato basato su Spring supportato da dati persistenti.

L'implementazione può essere trovata nel progetto GitHub: questo è un progetto basato su Maven, quindi dovrebbe essere facile da importare ed eseguire così com'è.