Разрешена ли системная переменная среды в keycloak realm.json?

#docker #environment-variables #keycloak

#docker #переменные среды #keycloak

Вопрос:

Я использую Keycloak для управления аутентификацией моего приложения.

И использование docker для создания моего образа keycloak как для среды разработки, так и для среды Prod.

Каждый раз, когда я создаю свой образ docker, я импортирую новый файл realm.json, и мне приходится вручную изменять конфигурацию для работы с соответствующей средой («Dev» и «Prod»).

Идея состоит в том, чтобы просто использовать ** системную переменную среды ** в realm.json. Я пытался использовать {MY_ENV_VARIABLE} и {env.MY_ENV_VARIABLE} , но, похоже, ничего не работает.

Комментарии:

1. «измените конфигурацию вручную», какую конфигурацию вы имеете в виду? область json?

2. Да, все, что мы можем найти в файле realm.json (области, клиенты, картограф, области …). На данный момент я готов настраивать RootUrl, RedirectUris и WebOrigins клиентов с переменными окружения

3. У меня была похожая проблема, я использовал шаблон realm.json с настраиваемыми полями, скажем, «RootUrl»: «<ROOTURI>», затем у меня есть скрипт, который копирует этот шаблон и автоматически заменяет теги, такие как <ROOTURI>, на правильный аргумент.

4. Я сделал то же самое с Shell для замены значений, и это работает, но мы обычно работаем с переменными env, и я не хочу добавлять дополнительный логический уровень. Вы хотите сказать, что это НЕ СПОСОБ использовать переменные env в realm.json?

5. Я думаю, вам всегда придется вводить, поэтому у вас есть дополнительный уровень, я не думаю, что переменные будут автоматически изменены. Вы смотрели на это levelup.gitconnected.com /…

Ответ №1:

Можно использовать переменные окружения в realm.json. Синтаксис обычный «$ {VARIABLE_NAME}».

Документы: https://www.keycloak.org/server/importExport

Ответ №2:

Это не работает, как сказал @Irmin. Как я справился с этим: внедрите своего пользовательского поставщика dir:

 factory : CustomDirProviderFactory implements ImportProviderFactory {

provider: public class CustomDirProvider implements ImportProvider {
  

И там вызывается метод переопределения

public void importRealm(KeycloakSessionFactory factory, конечная строка realmName, конечная стратегия Strategy) вызывает исключение IOException {

Там перед импортом Realmreporesentation вы можете заменить значения из вашего файла json:

 // Import realm first
    FileInputStream is = new FileInputStream(realmFile);
    final RealmRepresentation realmRep = JsonSerialization.readValue(replacePlaceHolders(enabledClient, clientSecret, is).getBytes(), RealmRepresentation.class);
  

замена переменных:

 private String replacePlaceHolders(String enabledClient, String clientSecret, FileInputStream is) throws IOException {
    Charset charset = StandardCharsets.UTF_8;
    String context = new String(is.readAllBytes(), charset);
    context = context.replaceAll("\$\{"   ENV_VAR_ENABLE_CLIENTS   "}", enabledClient);
    context = context.replaceAll("\$\{"   ENV_VAR_CLIENT_SECRET   "}", clientSecret);
    return context;
}
  

Конечно, добавьте этот файл в папку ресурсов и найдите своего провайдера:

 resources/META-INF/services/org.keycloak.exportimport.ImportProviderFactory
  

В настройках запуска jvm (в моей композиции) добавьте это:

 -Dkeycloak.migration.provider=custom-dir  (provider ID)