2015-03-12 29 views
6

Używam plątaniny klawiszy do ochrony mojego serwletu. Muszę dodawać nowe role i dynamicznie przypisywać je użytkownikom. Działa na keycloak używając interfejsu API administratora, ale nie wiem, jak uzyskać role dla konkretnego użytkownika w serwlecie.Uzyskiwanie ról użytkownika w aplikacji serwletu za pomocą placków klawiszowych

próbowałem tego rozwiązania, ale pojawia się zbiór pusty:

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

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

Odpowiedz

0

Jeśli aplet jest chroniona keyclaok następnie można wykorzystać następujące API, aby uzyskać KeycloakSecurityContext a następnie uzyskać dostęp do Set ról, aby go zmodyfikować .

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

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

Przykładowe żądanie serwletu może wyglądać następująco.

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

Dodawanie ról do kontekstu bezpieczeństwa Keycloak to zły pomysł. Te role będą obecne tylko do odświeżenia tokena. – Scott

2

@ Odpowiedź Shivy nie zadziałała dla mnie. getRealmAccess() zwracał wartość null. musieliśmy użyć następującego:

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

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

To prawda, jeśli w pliku keycloak.json opcja __ "use-resource-role-mappings": true__ ist została ustawiona – Boomer