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