Ho caricato i ruoli dal database per l'utente corrente. E posso accedere al ruolo utente con espressione di sicurezza primaverile in jsp, e posso nascondere le opzioni e gli URL che non sono autorizzati con hasRole. Ora volevo averlo nel servlet e visualizzarlo nei log (o memorizzare nella sessione dell'oggetto utente). Come possiamo ottenerlo?come ottenere i ruoli utente correnti da spring security 3.1
risposta
si può provare qualcosa di simile:
Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder.getContext().getAuthentication().getAuthorities();
Hai la raccolta dei ruoli nelle autorità variabili.
Aggiornamento: fisso typo di GrantedAuthority generico
Hai provato a chiamare getUserPrincipal() da HttpServletRequest?
Grazie per la risposta, non ho provato, ma ho implementato ciò che Dani detto, ha funzionato per me. – Bhas
Abbastanza giusto. Ecco una breve nota: l'approccio di Dani ha l'inconveniente di accoppiare il codice con l'implementazione della sicurezza Spring mentre getUserPricipal() è una chiamata standard nelle specifiche del servlet e dovrebbe funzionare con qualsiasi provider. – maximdim
Con getUserPrincipal() si ottiene solo il nome del richiedente. Penso che la domanda sia come ottenere i ruoli assegnati a quell'utente, quindi credo che in getUserPrincipal() non funzionerà anche in quel modo. – Jay
Per completare entrambe le risposte ...
Ecco un'implementazione Spring
sicurezza getUserPrincipal
, in modo da poter vedere che la realtà ci getUserPrincipal
SecurityContextHolder
public Principal getUserPrincipal() {
Authentication auth = getAuthentication();
if ((auth == null) || (auth.getPrincipal() == null)) {
return null;
}
return auth;
}
//And the getAuthentication
private Authentication getAuthentication() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!trustResolver.isAnonymous(auth)) {
return auth;
}
return null;
}
Se sviluppi su Java 8, diventa più semplice.
Per ottenere tutti i ruoli utente:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Set<String> roles = authentication.getAuthorities().stream()
.map(r -> r.getAuthority()).collect(Collectors.toSet());
per verificare se l'utente ha un ruolo particolare, ad esempio ROLE_USER:.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
boolean hasUserRole = authentication.getAuthorities().stream()
.anyMatch(r -> r.getAuthority().equals("ROLE_USER"));
def springSecurityService
def ruoli = springSecurityService.getAuthentication() getAuthorities()
Si prega di provare a fornire una risposta più ampia e formattata. Puoi controllare [Come scrivere una buona risposta?] (Https://stackoverflow.com/help/how-to-answer). –
Grazie Dani ha funzionato per me. – Bhas
siete i benvenuti;) – Dani
dovreste usare l'interfaccia di grantedauthority in questo elenco poiché l'implementazione può differire tra i provider di autorizzazione – Laures