2015-03-12 6 views
6

Ich benutze Schlüsselcloak, um mein Servlet zu schützen. Ich muss neue Rollen hinzufügen und sie Benutzern dynamisch zuweisen. Es funktioniert in Schlüsselverknüpfung mit Admin-API, aber ich kann nicht herausfinden, wie Sie die Rollen für bestimmte Benutzer in einem Servlet erhalten.Abrufen von Benutzerrollen in der Servlet-Anwendung mithilfe von keycloak

habe ich versucht, diese Lösung, aber ich leere Menge erhalten:

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

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

Antwort

0

Wenn das Servlet durch keyclaok geschützt ist, dann können Sie die folgende API verwenden, um die KeycloakSecurityContext zu bekommen und dann die Set von Rollen zuzugreifen, ihn zu ändern .

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

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

Eine Beispiel-Servlet-Anfrage könnte so aussehen.

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

Das Hinzufügen von Rollen zum Sicherheitskontext von Keycloak ist keine gute Idee. Diese Rollen sind nur vorhanden, bis das Token aktualisiert wird. – Scott

2

@ Shivas Antwort funktionierte nicht für mich. getRealmAccess() gab null zurück. wir mussten folgendes verwenden:

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

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

Das ist korrekt, wenn in keycloak.json die Option __ "use-resource-role-mappings": true__ ist gesetzt – Boomer