Невозможно выполнить миграцию со старого ключа клавиатуры 3.4.2 до последней версии - PullRequest
1 голос
/ 02 июля 2019

Я отвечаю за миграцию старого ключа (3.4.2) на последнюю версию.Я уже перенес базу данных и шаблон.Последнее, что создает проблему, это пользовательские провайдеры для учетной записи и входа.У меня есть два пользовательских провайдера, которые расширяются:

  • FreeMarkerAccountProviderFactory
  • FreeMarkerLoginProviderFactory

Сначала при запуске ключевого соединения в версии> 4 не было загружено ни одного провайдера..Икс.Я исследовал и обнаружил, что переопределение метода getId() по умолчанию для возврата значения, отличного от «freemarker» по умолчанию, заставляет keycloak загружать их снова.

Но после этого, если я пытаюсь получить доступ к странице входа, яполучил исключение nullpointer для org.keycloak.services.resources.account.AccountFormService.init(AccountFormService.java:139)

Любая идея?

Редактировать: spi в провайдере объявлен в META-INF / services и провайдере в standalone.xml

Редактировать 2: Я разделяю loginFormProvider, так как это та же проблема, вызывает ту же ошибку, но она менее сложна в реализации

public class KeycloakFreeMarkerLoginFormsProvider extends FreeMarkerLoginFormProvider {
    public KeycloakFreeMarkerLoginFormsProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
        super(sesssion, freeMarker);
    }

    public Response createResponse(LoginFormsPages page) {
        List<Foo> foo = // loading foo entities
        List<Bar> bar = // loading bar entities

        super.attributes.put("foo", foo);
        super.attributes.put("bar", bar);
        return super.createResponse(page);
    }
}

public class KeycloakFreeMarkerLoginProviderFactory extends FreeMarkerLoginFormsProviderFactory {

    private FreeMarkerUtil freeMarker;

    public KeycloakFreeMarkerLoginProviderFactory() {
        super();
    }

    @Override
    public LoginFormsProvider create(KeycloakSession session) {
        return new KeycloakFreeMarkerLoginFormsProvider(session, this.freeMarker);
    }

    @Override
    public void init(Config.Scope config) {
        this.freeMarker = new FreeMarkerUtil();
    }

    @Override
    public void close() {
        this.freeMarker = null;
    }

    /* Without getId() or with a value at freeMarker, the provider
    is not load. With other value, get NPE */
    @Override
    public String getId() {
         return "custom.provider";
    }
}

1 Ответ

0 голосов
/ 03 июля 2019

Судя по цепочке комментариев, проблема в том, что провайдер не подхватывается Keycloak. У вас есть несколько вариантов связывания собственного провайдера с Keycloak: в виде модуля или в виде развернутого файла war / ear / jar в каталоге развертывания.

Вот как это сделать как модуль:

Вам потребуется добавить некоторую конфигурацию (module.xml) и ваш jar-файл в структуру каталогов модулей. Это должно выглядеть примерно так:

(keycloak root)
|- modules
   |- system
      |- layers
         |- keycloak
            |- com
               |- yourcompany
                  |- yourmodule
                     |- main
                        |- your-module-name.jar
                        |- module.xml (see below)

Ваш module.xml должен выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<module name="com.yourcompany.yourmodule" xmlns="urn:jboss:module:1.6">
    <resources>
        <resource-root path="your-module-name.jar"/>
    </resources>
    <dependencies>
        <!-- whatever module dependencies you need go here -->
        <!-- these are just an example; you may or may not need them -->
        <module name="org.jboss.logging" />
        <module name="org.keycloak.keycloak-core"/>
        <module name="org.keycloak.keycloak-services"/>
        <module name="org.keycloak.keycloak-server-spi"/>
        <module name="org.keycloak.keycloak-server-spi-private"/>
    </dependencies>
</module>

Кроме того, вам необходимо настроить standalone.xml и / или, возможно, standalone-ha.xml в зависимости от вашего сценария (по умолчанию в образе док-станции Keycloak Docker используется -ha.xml по умолчанию). Соответствующий раздел должен выглядеть примерно так:

    <subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
        <web-context>auth</web-context>
        <providers>
            <provider>
                classpath:${jboss.home.dir}/providers/*
            </provider>
<!-- add this -->
            <provider>
                module:com.yourcompany.yourmodule
            </provider>
<!-- end add -->
        </providers>
        <master-realm-name>master</master-realm-name>
        <scheduled-task-interval>900</scheduled-task-interval>
        ...
    </subsystem>

Наконец, как вы упомянули, вам понадобится правильная конфигурация в каталоге META-INF / services: файл с полным именем класса ProviderFactory, как определено SPI, с одной строкой, содержащей полное имя класса ваша реализация. В вашем случае файл должен называться org.keycloak.forms.login.LoginFormsProviderFactory, а его значение должно быть одной строкой: (com.yourpackage).KeycloakFreeMarkerLoginProviderFactory

Если он поднят, вы сможете увидеть его в списке провайдеров в пользовательском интерфейсе администратора. Для просмотра войдите в консоль администратора, щелкните свое имя пользователя в правом верхнем углу и выберите «Информация о сервере», затем перейдите на вкладку «Поставщики». Вы должны увидеть своего провайдера в списке «логин».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...