Получить имя пользователя, вошедшего в систему, в веб-приложении, защищенном с помощью Keycloak

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

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


person aksappy    schedule 06.08.2015    source источник


Ответы (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

person sebplorenz    schedule 07.08.2015
comment
KeyCloakPrincipal доступен из keycloak-core, для тех, кто не знает, откуда он - person aksappy; 07.08.2015
comment
В случае исключений нулевого указателя, с которыми я столкнулся при использовании вышеуказанного с токеном носителя: используйте getToken() вместо getIdToken() - person devrys; 03.04.2016

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

person user3569718    schedule 30.08.2016
comment
Благодарю вас! Это гораздо лучший ответ, чем принятый, потому что ваш ответ позволяет SessionContext.getCallerPrincipal.getName работать на уровне EJB, если весь проект был упакован как EAR. - person j.con; 24.01.2017

Нужно добавить в standalone.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>
person Sergey Sarabun    schedule 08.05.2018

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

person Yeroc    schedule 11.05.2018

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

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

Для работы мне пришлось перейти к keycloak и добавить в свой клиентский шаблон встроенные функции добавления, если не добавлено предпочтительное имя пользователя, стало нулевым.

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

После этого если сработало!

person cabaji99    schedule 03.09.2018