Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Obtaining user roles in servlet application using keycloak

I'm using keycloak to protect my servlet. I have to add new roles and assign them to users dynamically. It works in keycloak using admin API, but I can't figure out how to obtain the roles for specific user in a servlet.

I tried this solution, but I get empty set:

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

KeycloakSecurityContext context = (KeycloakSecurityContext)request.getAttribute(KeycloakSecurityContext.class.getName());
    Set<String> roles = AdapterUtils.getRolesFromSecurityContext((RefreshableKeycloakSecurityContext) context);
...
}
like image 990
Ilja Sucharev Avatar asked Mar 12 '15 16:03

Ilja Sucharev


2 Answers

@Shiva's answer did not work for me. getRealmAccess() was returning null. we had to use the following:

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

String clientId = "securesite";
principal.getKeycloakSecurityContext().getToken().getResourceAccess(clientId).getRoles();
like image 195
Nicholas Ackerman Avatar answered Nov 17 '22 03:11

Nicholas Ackerman


If the servlet is protected by keyclaok then you can use the following API to get the KeycloakSecurityContext and then access the Set of roles to modify it.

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

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

A sample servlet request might look like this.

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

        }
}
like image 45
Shiva Avatar answered Nov 17 '22 02:11

Shiva