Keycloak Имитировать - PullRequest
       11

Keycloak Имитировать

0 голосов
/ 27 сентября 2018

Мне нужно предоставить функцию олицетворение за пределами Keycloak Admin Console, очень похожую на кнопку для олицетворения.Я вызываю Keycloak REST API для

  1. получения access_token, (auth / realms / master / protocol / openid-connect / token)
  2. , который затем анализируется в другомвызов для олицетворения пользователя admin / realms / {realm} / users / {id} / олицетворения.

Второй вызов возвращает ссылку перенаправления с логическим значением, и в заголовках, помимо других, есть файлы cookie KEYCLOAK_SESSION и KEYCLOAK_IDENTITY.

Мне нужно каким-то образом выйти из приложения, установить эти cookie-файлы в браузере, выполнить переадресацию на страницу входа и войти в систему как другой пользователь.Я думаю, что это обычная ситуация, и у Keycloak есть чудо-кнопка Impersonate, которая делает то же самое, но мне нужно, чтобы она была вне консоли администратора.Может ли кто-нибудь помочь с гепатитом?Большое спасибо

1 Ответ

0 голосов
/ 01 августа 2019

Я только что реализовал эту функцию для нашего KC, мы использовали подход REST API.«Суперпользователь» должен быть авторизован (действительный сеанс KC).Затем они могут начать сеанс олицетворения, мы решили использовать имя пользователя, чтобы найти олицетворяющего.После того, как вы подтвердите существование человека в области KC, вы можете создать UserSessionModel для этого человека.Затем, создав файл cookie для входа в систему, я узнал, что в KC AuthenticationManager есть небольшой метод, который создает файл cookie для входа в систему и добавляет его в заголовки ответа (очень круто).Затем я сохранил свои учетные данные (суперпользователь) в файле cookie и возвратил ответ с добавленными файлами cookie.Метод return REST очень похож, процесс, который он принимает, отличается, потому что нам нужно передать куки обратно и получить идентификатор суперпользователя и идентификатор его сеанса.Если у вас есть те, которые вы просто повторите первый метод (найти пользователя, найти сеанс вместо создания нового, если время старого сеанса не истекло), перенаправьте обратно на источник.О, также не забудьте завершить сеанс олицетворения.

personYouImpersonatedSessionId = session.sessions().getUserSession(RealmModel,AuthSessionId)
if(!personYouImpersonatedSessionId) {
      session.sessions().removeUserSession(RealmModel,personYouImpersonatedSessionId)
}

Я забыл сделать это во время тестирования и столкнулся с некоторыми проблемами.Я знаю, что пост старый, но есть люди, которые все еще ищут информацию такого типа: D

Надеюсь, это поможет

...