Получение имени пользователя, зарегистрированного в 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.
Проверьте имя пользователя на встроенных входах, шаблон клиента - > картографы.
после этого, если получилось!
