С тех пор я разобрался, как решить проблему!
Сначала добавьте в верхнюю часть класса следующее:
@Context
SecurityContext securityContext;
Это будет введено в контексте безопасности сервера. Чтобы это работало с Keycloak, WildFly должен иметь установленный адаптер Wildfly и web.xml должен быть настроен для использования Keycloak.
Прежде чем мы продолжим, нам нужна библиотека Keycloak-Core, например, на Maven:
<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-core -->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>4.4.0.Final</version>
</dependency>
4.4.0.Final
была последней версией на момент написания этого ответа; Рекомендуется использовать либо последнюю версию, либо версию, которая соответствует версии сервера Keycloak.
Далее, в точке, где вы хотите получить информацию о пользователе, вы получаете UserPrincipal:
if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());
Дополнительные проверки являются отказоустойчивыми, поэтому конфигурации без Keycloak можно обрабатывать отдельно.
Из приведенного KeycloakPrinciple извлеките KeycloakSecurityContext и оттуда токен пользователя:
AccessToken token = principal.getKeycloakSecurityContext().getToken();
В некоторых случаях (в зависимости от версии вашего Keycloak и / или WildFly) getToken () может возвращать ноль. В этих случаях используйте getIdToken ():
IDToken token = principal.getKeycloakSecurityContext().getIdToken();
AccessToken расширяет IDToken, поэтому у вас есть полная функциональность (для этого контекста) в обоих случаях.
Из токена могут быть извлечены все пользовательские данные. В качестве примера мы получаем имя пользователя пользователя. В Keycloak это свойство называется «предпочтительным именем пользователя».
String user = token.getPreferredUsername();
И все готово! Ваш полный код теперь может выглядеть так:
if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());
AccessToken token = principal.getKeycloakSecurityContext().getToken();
// IDToken token = principal.getKeycloakSecurityContext().getIdToken();
System.out.println("User logged in: " + token.getPreferredUsername());
} else {
System.out.println("SecurityContext could not provide a Keycloak context.");
}