2012-04-10 12 views
17

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

53

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

+0

Grazie Dani ha funzionato per me. – Bhas

+1

siete i benvenuti;) – Dani

+2

dovreste usare l'interfaccia di grantedauthority in questo elenco poiché l'implementazione può differire tra i provider di autorizzazione – Laures

7

Hai provato a chiamare getUserPrincipal() da HttpServletRequest?

+0

Grazie per la risposta, non ho provato, ma ho implementato ciò che Dani detto, ha funzionato per me. – Bhas

+7

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

+3

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

2

Per completare entrambe le risposte ...

Ecco un'implementazione Spring sicurezza getUserPrincipal, in modo da poter vedere che la realtà ci getUserPrincipalSecurityContextHolder

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; 
} 
6

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")); 
0

def springSecurityService

def ruoli = springSecurityService.getAuthentication() getAuthorities()

+2

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). –

Problemi correlati