Come scoprire l’utente attualmente loggato in Spring Boot?

In questa applicazione di avvio di spring è disponibile un servizio Web che restituisce alcuni dati per un utente che ha effettuato l’accesso:

@RequestMapping("/resource") public Map home() { Map model = new HashMap(); model.put("id", UUID.randomUUID().toString()); model.put("content", "Hello World"); return model; } 

Immagina, il valore di ritorno del metodo dipende da quale utente è attualmente connesso.

Come posso scoprire quale utente ha effettuato l’accesso con quel metodo?

Come richiesto:

Spring Boot che usa Spring Security fornisce internamente una class SecurityContextHolder che consente la ricerca dell’utente attualmente autenticato tramite:

 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

L’istanza di autenticazione ora fornisce i seguenti metodi:

  • Ottieni il nome utente dell’utente che ha effettuato l’accesso: getPrincipal()
  • Ottieni la password dell’utente autenticato: getCredentials()
  • Ottieni i ruoli assegnati dell’utente autenticato: getAuthorities()
  • Ottieni ulteriori dettagli dell’utente autenticato: getDetails()

Puoi semplicemente usare HttpServletRequest anche per ottenere il principio utente,

utilizzando la richiesta HttpServletRequest,

 String user=request.getUserPrincipal().getName(); 

Un modo è aggiungere java.security.Principal come parametro come segue:

 @RequestMapping("/resource") public Map home(Principal principal) { Map model = new HashMap(); model.put("id", UUID.randomUUID().toString()); model.put("content", "Hello " + principal.getName()); return model; } 

Da Spring Security 4.0 è ansible ottenere l’utente attualmente connesso (la propria implementazione di UserDetails ) aggiungendo un parametro all’interno del proprio metodo di controller:

 @RequestMapping("/resource") public Map home(@AuthenticationPrincipal User user) { .. } 

Sostituisci User con il nome della tua class che implementa l’interfaccia UserDetails .

Recentemente l’utilizzo del server di autenticazione Keycloak e l’accesso ai dati utente attualmente connessi sono accessibili in questo modo

 String userID; KeycloakPrincipal kcPrincipal = getPrincipal(); KeycloakSecurityContext ksContext = kcPrincipal.getKeycloakSecurityContext(); IDToken idToken = ksContext.getToken(); userID = idToken.getName(); 

Sto usando Spring Boot 2.0 con OAuth, quindi lo sto facendo in questo modo

 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Object pricipal = auth.getPrincipal(); String user=""; if (pricipal instanceof DefaultOidcUser) { user = ((DefaultOidcUser) pricipal).getName(); }