2015-03-12 26 views
6

Sto usando il tasto per proteggere il mio servlet. Devo aggiungere nuovi ruoli e assegnarli agli utenti in modo dinamico. Funziona con il keycloak utilizzando l'API di amministrazione, ma non riesco a capire come ottenere i ruoli per un utente specifico in un servlet.Recupero dei ruoli utente nell'applicazione servlet tramite il tasto chiave

ho provato questa soluzione, ma ottengo insieme vuoto:

protected void doPost(HttpServletRequest request, HttpServletResponse response) { 
... 

KeycloakSecurityContext context = (KeycloakSecurityContext)request.getAttribute(KeycloakSecurityContext.class.getName()); 
    Set<String> roles = AdapterUtils.getRolesFromSecurityContext((RefreshableKeycloakSecurityContext) context); 
... 
} 

risposta

0

Se il servlet è protetta da keyclaok quindi è possibile utilizzare il seguente API per ottenere il KeycloakSecurityContext e quindi accedere alla Set dei ruoli di modificarlo .

KeycloakPrincipal principal = (KeycloakPrincipal) request.getUserPrincipal(); 

principal.getKeycloakSecurityContext().getToken().getRealmAccess().getRoles().add("Test-Role"); 

Una richiesta di servlet di esempio potrebbe essere simile a questa.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    @SuppressWarnings("rawtypes") 
    KeycloakPrincipal principal = (KeycloakPrincipal)request.getUserPrincipal(); 
    if (principal != null) { 
     //user has a valid session, we can assign role on the fly like this 
     principal.getKeycloakSecurityContext().getToken().getRealmAccess().getRoles().add("Test-Role"); 

     } 
} 
+2

L'aggiunta di ruoli al contesto di protezione Keycloak è una cattiva idea. Questi ruoli saranno presenti solo fino all'aggiornamento del token. – Scott

2

@ La risposta di Shiva non ha funzionato per me. getRealmAccess() restituiva null. abbiamo dovuto utilizzare quanto segue:

KeycloakPrincipal principal = (KeycloakPrincipal) request.getUserPrincipal(); 

String clientId = "securesite"; 
principal.getKeycloakSecurityContext().getToken().getResourceAccess(clientId).getRoles(); 
+0

Questo è corretto se in keycloak.json l'opzione __ "use-resource-role-mapping": true__ ist set – Boomer