У меня есть приложение, которое печатает всех пользователей Keycloak. Я делаю это с помощью клиентского адаптера (в частности, JBoss EAP / WildFly Adapter). Для этого я написал класс обслуживания:
@Named
@SessionScoped
public class KeycloakService implements Serializable {
final static String CLIENT_NAME_REALM_MANAGEMENT = "realm-management";
@Inject
SecurityContext securityContext;
@Inject
private KeycloakConfigLoader keycloakConfigLoader;
private Keycloak keycloak;
private KeycloakDeployment deployment;
public KeycloakDeployment getDeployment() {
if (deployment == null) {
deployment = keycloakConfigLoader.getDeployment();
}
return deployment;
}
public Keycloak getKeycloak() {
if (keycloak == null || keycloak.isClosed()) {
keycloak = Keycloak.getInstance(
getDeployment().getAuthServerBaseUrl(),
getDeployment().getRealm(),
CLIENT_NAME_REALM_MANAGEMENT,
getKeycloakSecurityContext().getTokenString()
);
}
return keycloak;
}
public RealmResource getRealmResource() {
return getKeycloak().realm(getDeployment().getRealm());
}
public RolesResource getRealmRoles() {
return getRealmResource().roles();
}
public UsersResource getUsersResource() {
return getRealmResource().users();
}
public UserResource getUserResource(String id) {
return getUsersResource().get(id);
}
public RefreshableKeycloakSecurityContext getKeycloakSecurityContext() {
return (RefreshableKeycloakSecurityContext) ((KeycloakPrincipal) securityContext.getCallerPrincipal()).getKeycloakSecurityContext();
}
}
Теперь у меня проблема в том, что токен доступа не обновляется автоматически sh через созданный объект Keycloak (getInstance
) в конце токена доступа время жизни, и поэтому я получаю 401
ошибку. Это в принципе логично, поскольку срок действия токена истек.
Если я не "кэширую" (keycloak == null
) экземпляр Keycloak в верхнем классе, все работает, потому что токен доступа SecurityContext
всегда используется, и этот токен обновляется сам. Но это не является оптимальным с точки зрения производительности, поскольку экземпляр создается каждый раз.
Кто-нибудь знает, с чем это может быть связано, или как я могу дать экземпляру Keycloak новый токен доступа без нового инициализировать объект keycloak? Или я в основном неправильно использую Keycloak Adapter?