2015-03-12 2 views
6

Я использую keycloak для защиты своего сервлета. Я должен добавлять новые роли и динамически назначать их пользователям. Он работает в keycloak, используя admin API, но я не могу понять, как получить роли для конкретного пользователя в сервлете.Получение роли пользователя в приложении сервлета с помощью keycloak

Я попробовал это решение, но я получаю пустой набор:

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

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

ответ

0

Если сервлет защищен keyclaok, то вы можете использовать следующие API, чтобы получить KeycloakSecurityContext, а затем получить доступ к Set ролей, чтобы изменять его ,

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

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

Пример запроса сервлета может выглядеть следующим образом.

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

Добавление ролей в контекст безопасности Keycloak - плохая идея. Эти роли будут присутствовать только до тех пор, пока токен не будет обновлен. – Scott

2

@ Ответ Шивы не работает для меня. getRealmAccess() возвращал значение null. мы должны были использовать следующее:

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

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

Это правильно, если в keycloak.json опция __ "use-resource-role-mappings": true__ ist set – Boomer

Смежные вопросы