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:
getPrincipal()
getCredentials()
getAuthorities()
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(); }