Class CustomUserDetailsService
- All Implemented Interfaces:
org.springframework.security.core.userdetails.UserDetailsService
Questa classe implementa l'interfaccia standard UserDetailsService per Spring Security
e fornisce metodi aggiuntivi per la gestione della logica di business legata agli utenti,
come la registrazione con calcolo manuale dell'ID.
Il servizio agisce da ponte tra il database (tramite Repository) e il SecurityContext,
trasformando le entità di dominio UtenteEntity in oggetti UserDetails
comprensibili dal framework di sicurezza. Utilizza anche meccanismi di caching
per ottimizzare le prestazioni in lettura.
- Version:
- 1.3.1
- Author:
- Modulink Team
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final AziendaRepositoryRepository per recuperare le informazioni dell'azienda in fase di registrazione.private final UserRepositoryRepository per l'accesso ai dati persistenti dell'utente. -
Constructor Summary
ConstructorsConstructorDescriptionCustomUserDetailsService(UserRepository userRepository, AziendaRepository aziendaRepository) Costruttore per l'iniezione delle dipendenze (Dependency Injection). -
Method Summary
Modifier and TypeMethodDescriptionvoidaggiornaUtente(UtenteEntity utente) Aggiorna i dati di un utente esistente e invalida le cache pertinenti.findByEmail(String email) Cerca un utente per email utilizzando la cache.getAllByAzienda(AziendaEntity aziendaEntity) Recupera tutti gli utenti associati a una specifica azienda, utilizzando la cache.getAllByAziendaExcludingUser(AziendaEntity azienda, int idUtente) Recupera la lista di tutti gli utenti di un'azienda, escludendo un utente specifico.getAllUsersFromIDs(List<Integer> ids, int id_azienda) Recupera una lista di utenti a partire da una lista di ID, verificando l'appartenenza all'azienda.getByID(int id, int id_azienda) Recupera un singolo utente tramite ID e ID azienda.booleanisThisaNewUtente(UtenteEntity utente) Verifica se un utente è considerato "nuovo" basandosi sui suoi ruoli.org.springframework.security.core.userdetails.UserDetailsloadUserByUsername(String email) Carica un utente basandosi sul suo identificativo di login (Email).voidregistraUtente(UtenteEntity nuovoUtente, int idAzienda) Gestisce la registrazione di un nuovo utente con ID calcolato manualmente.voidrimuoviUtente(UtenteEntity utente) Rimuove un utente dal sistema e pulisce le cache associate.
-
Field Details
-
userRepository
Repository per l'accesso ai dati persistenti dell'utente. Utilizzato per il recupero dell'entità durante il login e il salvataggio in registrazione. -
aziendaRepository
Repository per recuperare le informazioni dell'azienda in fase di registrazione. Necessario per associare correttamente l'utente al suo contesto aziendale.
-
-
Constructor Details
-
CustomUserDetailsService
Costruttore per l'iniezione delle dipendenze (Dependency Injection).Spring 4.3+ inietta automaticamente le dipendenze nei costruttori unici senza necessità dell'annotazione
@Autowired.- Parameters:
userRepository- L'istanza del repository Utente gestita dal container.aziendaRepository- L'istanza del repository Azienda gestita dal container.
-
-
Method Details
-
loadUserByUsername
@Cacheable(value="userDetails", key="#email") public org.springframework.security.core.userdetails.UserDetails loadUserByUsername(String email) throws org.springframework.security.core.userdetails.UsernameNotFoundException Carica un utente basandosi sul suo identificativo di login (Email).Sebbene il metodo si chiami
loadUserByUsername, nel sistema Modulink l'identificativo univoco per il login è l'indirizzo email.Questo metodo viene invocato dal
DaoAuthenticationProviderdurante il processo di autenticazione. Se l'utente viene trovato, la verifica della password verrà effettuata automaticamente dal provider confrontando l'hash memorizzato con quello fornito. Il risultato viene cachato per migliorare le performance delle richieste successive.- Specified by:
loadUserByUsernamein interfaceorg.springframework.security.core.userdetails.UserDetailsService- Parameters:
email- L'email fornita dall'utente nel form di login.- Returns:
- Un'istanza di
CustomUserDetailscontenente le credenziali e i ruoli dell'utente. - Throws:
org.springframework.security.core.userdetails.UsernameNotFoundException- Se nessun utente viene trovato con l'email fornita.
-
registraUtente
@CacheEvict(value={"users","userDetails"},key="#nuovoUtente.email") @CacheEvict(value="usersByAzienda",key="#idAzienda") public void registraUtente(UtenteEntity nuovoUtente, int idAzienda) Gestisce la registrazione di un nuovo utente con ID calcolato manualmente.Poiché l'architettura utilizza una chiave primaria composta (ID Azienda + ID Utente) senza auto-increment globale, questo metodo:
- Verifica l'esistenza dell'azienda specificata nel database.
- Interroga il database per trovare l'ID utente massimo corrente per quell'azienda specifica.
- Assegna al nuovo utente l'ID calcolato (MAX + 1).
- Salva l'utente nel database rendendo persistente la relazione.
L'annotazione
Transactionalgarantisce che tutte le operazioni (lettura MAX ID e salvataggio) avvengano atomicamente. Invalida le cache pertinenti per garantire coerenza.- Parameters:
nuovoUtente- L'oggettoUtenteEntitypopolato con i dati anagrafici (Nome, Email, Password Hash).idAzienda- L'identificativo dell'azienda a cui associare l'utente.- Throws:
IllegalArgumentException- Se l'azienda con l'ID specificato non esiste, interrompendo la registrazione.
-
findByEmail
Cerca un utente per email utilizzando la cache.- Parameters:
email- L'email dell'utente da cercare.- Returns:
- Un
Optionalcontenente l'utente se trovato.
-
getAllByAzienda
@Cacheable(value="usersByAzienda", key="#aziendaEntity.id_azienda") public List<UtenteEntity> getAllByAzienda(AziendaEntity aziendaEntity) Recupera tutti gli utenti associati a una specifica azienda, utilizzando la cache.- Parameters:
aziendaEntity- L'entità azienda di riferimento.- Returns:
- Una lista di utenti appartenenti all'azienda.
-
getAllByAziendaExcludingUser
Recupera la lista di tutti gli utenti di un'azienda, escludendo un utente specifico.Utile per liste di destinatari o assegnazioni dove non si vuole includere se stessi.
- Parameters:
azienda- L'azienda di appartenenza.idUtente- L'ID dell'utente da escludere (solitamente l'utente corrente).- Returns:
- Lista di utenti filtrata.
-
rimuoviUtente
@CacheEvict(value={"users","userDetails"},key="#utente.email") @CacheEvict(value="usersByAzienda",key="#utente.azienda.id_azienda") public void rimuoviUtente(UtenteEntity utente) Rimuove un utente dal sistema e pulisce le cache associate.Prima dell'eliminazione, disaccoppia le associazioni ai ruoli per mantenere la coerenza del grafo degli oggetti e prevenire errori di integrità referenziale.
- Parameters:
utente- L'entità utente da rimuovere.
-
aggiornaUtente
@CacheEvict(value={"users","userDetails"},key="#utente.email") @CacheEvict(value="usersByAzienda",key="#utente.azienda.id_azienda") public void aggiornaUtente(UtenteEntity utente) Aggiorna i dati di un utente esistente e invalida le cache pertinenti.- Parameters:
utente- L'entità utente con i dati aggiornati.
-
isThisaNewUtente
Verifica se un utente è considerato "nuovo" basandosi sui suoi ruoli.In questa implementazione, un utente è considerato nuovo se possiede il ruolo con ID 1 (convenzionalmente assegnato ai nuovi iscritti o utenti base).
- Parameters:
utente- L'utente da verificare.- Returns:
truese l'utente ha il ruolo ID 1,falsealtrimenti.
-
getAllUsersFromIDs
public List<UtenteEntity> getAllUsersFromIDs(List<Integer> ids, int id_azienda) throws UserNotFoundException Recupera una lista di utenti a partire da una lista di ID, verificando l'appartenenza all'azienda.- Parameters:
ids- Lista degli ID utenti da recuperare.id_azienda- L'ID dell'azienda per contestualizzare la ricerca.- Returns:
- Una lista di entità Utente corrispondenti.
- Throws:
UserNotFoundException- Se uno degli ID non corrisponde a nessun utente nell'azienda specificata.
-
getByID
Recupera un singolo utente tramite ID e ID azienda.- Parameters:
id- L'ID dell'utente.id_azienda- L'ID dell'azienda.- Returns:
- L'entità Utente trovata.
- Throws:
UserNotFoundException- Se l'utente non viene trovato.
-