#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)