Получение имени пользователя, зарегистрированного в webapp, защищенном Keycloak

я обеспечил корпоративное приложение с помощью Keycloak, используя стандартные адаптеры Keycloak на основе Wildfly. Проблема, с которой я сталкиваюсь, заключается в том, что веб-службы rest при вызове должны знать имя пользователя, которое в настоящее время вошло в систему. Как сделать вход в информации пользователя от Keycloak?

Я попытался с помощью SecurityContext , WebListener etc. Но никто из них не в состоянии сообщить мне необходимые детали.

5 ответов


вы получаете всю информацию о пользователе из контекста безопасности.

пример:

public class Greeter {

  @Context
  SecurityContext sc;

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public String sayHello() {

    // this will set the user id as userName
    String userName = sc.getUserPrincipal().getName();

    if (sc.getUserPrincipal() instanceof KeycloakPrincipal) {
      KeycloakPrincipal<KeycloakSecurityContext> kp = (KeycloakPrincipal<KeycloakSecurityContext>)  sc.getUserPrincipal();

      // this is how to get the real userName (or rather the login name)
      userName = kp.getKeycloakSecurityContext().getIdToken().getPreferredUsername();
    }

    return "{ message : \"Hello " + userName + "\" }";
}

для распространения контекста безопасности необходимо настроить домен безопасности, как описано в: конфигурация адаптера JBoss/Wildfly


вы также можете установить principal-attribute собственность в keycloak.json файл вашего веб-приложения в preferred_username.


нужно добавить изолированную.следующая строка xml:

<principal-attribute>preferred_username</principal-attribute>

пример:

<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
    <secure-deployment name="war-name.war">
        <realm>realm-name</realm>
        <resource>resource-name</resource>
        <public-client>true</public-client>
        <auth-server-url>https://keycloak-hostname/auth</auth-server-url>
        <ssl-required>EXTERNAL</ssl-required>
        <principal-attribute>preferred_username</principal-attribute>
    </secure-deployment>
</subsystem>

в Keycloak 3.4.3 (может также работать на более ранних версиях) я смог сопоставить имя пользователя с sub маркер названным иском. Из интерфейса администратора Keycloak это делается в разделе Clients > [your-client] > Mappers > username и затем введите sub на Token Claim Name поле. Это имеет то преимущество, что фактически изменяет содержимое ID token возвращается Keycloak, а не настраивается на стороне клиента, как в другого ответа. Это особенно приятно, когда вы используете стандартную библиотеку OpenID Connect, а не адаптер, предоставляемый Keycloak.


в моем случае я брал предпочтительное имя пользователя из токена, как это

keycloakPrincipal.getKeycloakSecurityContext().getToken();
token.getPreferredUsername();

для работы я должен был пойти в keycloak и добавить на мой шаблон клиента add builtins, если не добавлено предпочтительное имя пользователя, пришел null.

Проверьте имя пользователя на встроенных входах, шаблон клиента - > картографы.

после этого, если получилось!