Recupera le informazioni sull'utente in Spring Security

1. Panoramica

Questo articolo mostrerà come recuperare i dettagli dell'utente in Spring Security .

L'utente attualmente autenticato è disponibile attraverso una serie di meccanismi diversi in Spring - esaminiamo prima la soluzione più comune: l'accesso programmatico.

2. Ottieni l'utente in un bean

Il modo più semplice per recuperare l'entità attualmente autenticata è tramite una chiamata statica a SecurityContextHolder :

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String currentPrincipalName = authentication.getName();

Un miglioramento a questo frammento consiste nel verificare innanzitutto se è presente un utente autenticato prima di tentare di accedervi:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (!(authentication instanceof AnonymousAuthenticationToken)) { String currentUserName = authentication.getName(); return currentUserName; }

Ci sono ovviamente degli svantaggi nell'avere una chiamata statica come questa: la minore testabilità del codice è uno dei più ovvi. Invece, esploreremo soluzioni alternative per questo requisito molto comune.

3. Porta l'utente in un controller

In un bean annotato @Controller , ci sono opzioni aggiuntive. Il principal può essere definito direttamente come argomento del metodo e verrà risolto correttamente dal framework:

@Controller public class SecurityController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Principal principal) { return principal.getName(); } }

In alternativa, possiamo anche utilizzare il token di autenticazione :

@Controller public class SecurityController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Authentication authentication) { return authentication.getName(); } }

L'API della classe Authentication è molto aperta in modo che il framework rimanga il più flessibile possibile. Per questo motivo , l'entità Spring Security può essere recuperata solo come un oggetto e deve essere sottoposto a cast all'istanza UserDetails corretta :

UserDetails userDetails = (UserDetails) authentication.getPrincipal(); System.out.println("User has authorities: " + userDetails.getAuthorities());

E infine, direttamente dalla richiesta HTTP :

@Controller public class GetUserWithHTTPServletRequestController { @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple(HttpServletRequest request) { Principal principal = request.getUserPrincipal(); return principal.getName(); } }

4. Ottieni l'utente tramite un'interfaccia personalizzata

Per sfruttare appieno l'inserimento delle dipendenze Spring ed essere in grado di recuperare l'autenticazione ovunque, non solo nei bean @Controller , dobbiamo nascondere l'accesso statico dietro una semplice facciata:

public interface IAuthenticationFacade { Authentication getAuthentication(); } @Component public class AuthenticationFacade implements IAuthenticationFacade { @Override public Authentication getAuthentication() { return SecurityContextHolder.getContext().getAuthentication(); } }

La facciata espone l' oggetto Authentication nascondendo lo stato statico e mantenendo il codice disaccoppiato e completamente testabile:

@Controller public class GetUserWithCustomInterfaceController { @Autowired private IAuthenticationFacade authenticationFacade; @RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple() { Authentication authentication = authenticationFacade.getAuthentication(); return authentication.getName(); } }

5. Ottieni l'utente in JSP

È possibile accedere all'entità attualmente autenticata anche nelle pagine JSP , sfruttando il supporto per taglib di sicurezza a molla. Innanzitutto, dobbiamo definire il tag nella pagina:

Successivamente, possiamo fare riferimento al principale :

 authenticated as  

6. Ottieni l'utente in Thymeleaf

Thymeleaf è un moderno motore di template web lato server, con una buona integrazione con il framework Spring MVC. Vediamo come accedere al principale attualmente autenticato in una pagina con il motore Thymeleaf.

Innanzitutto, dobbiamo aggiungere le dipendenze thymeleaf-spring5 e thymeleaf-extras-springsecurity5 per integrare Thymeleaf con Spring Security:

 org.thymeleaf.extras thymeleaf-extras-springsecurity5   org.thymeleaf thymeleaf-spring5 

Ora possiamo fare riferimento al principal nella pagina HTML utilizzando l' attributo sec: authorize :

 Authenticated as 

7. Conclusione

Questo articolo ha mostrato come ottenere le informazioni sull'utente in un'applicazione Spring, iniziando con il meccanismo di accesso statico comune, seguito da diversi modi migliori per iniettare il principale.

L'implementazione di questi esempi può essere trovata nel progetto GitHub: questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è. Quando il progetto viene eseguito in locale, è possibile accedere all'HTML della home page all'indirizzo:

//localhost:8080/spring-security-rest-custom/foos/1