Загрузка классов для пользовательских модулей входа в систему jaas в WebSphere Liberty

ОБНОВЛЕНИЕ: Некоторый контекст по проблеме ниже. Моя цель состоит в том, чтобы обрабатывать запросы пользователей, когда они предоставляют тему Kafka для каждого запроса. Я использую Message Hub, развернутый в Bluemix, в качестве поставщика Kafka. В запросах будут переданы URL брокера, имя темы, имя пользователя, пароль и ключ API. Message Hub в Bluemix требует аутентификации JAAS и предоставляет модуль входа в систему с различными реализациями LoginModule. Некоторые основаны на CallbackHandlers, другие на CredentialProviders.

Я выбрал тот, который реализован в com.ibm.messagehub.login.MultiUserLoginModule, С этим модулем мне нужно было только предоставить поставщика учетных данных, например:

KafkaClient {
com.ibm.messagehub.login.MultiUserLoginModule required
credentialProvider="myApp.CustomCredentialProvider";
};

Проблемы заключаются в загрузчике классов и в том, как CustomCredentialProvider может получить имя пользователя / пароль из запроса, переданного в MultiUserLoginModule во время выполнения. Какую конфигурацию я должен использовать, чтобы это работало?

ДЕТАЛИ. У меня есть веб-приложение, работающее в WebSphere Liberty 8.5.5, и я хочу пройти аутентификацию с помощью стороннего сервиса. Этот сторонний сервис реализует JAAS LoginModule с CredentialProvider. Мое веб-приложение расширяет CredentialProvider с помощью CustomCredentialProvider для передачи учетных данных.

Я не понимаю, как должна работать загрузка классов. мой server.xml определяет:

Веб-приложение

 <webApplication id="streaming-service" location="streaming-service.war" name="streaming-service"/>

Сторонний модуль входа

<jaasLoginModule className="com.ibm.messagehub.login.MultiUserLoginModule" controlFlag="REQUIRED" id="KafkaClient" libraryRef="messageHubLoginLib">
<options credentialProvider="myApp.CustomCredentialProvider" serviceName="kafka"/>
</jaasLoginModule>

Библиотека, которая реализует сторонний модуль входа

   <library id="messageHubLoginLib">
    <fileset dir="${server.output.dir}" includes="messagehub.login-1.0.0.jar"/>
</library>

Контекст входа

 <jaasLoginContextEntry id="KafkaClient" loginModuleRef="KafkaClient" name="KafkaClient"/>

Результатом вышеупомянутой конфигурации является ClassNotFoundException для моего CustomCredentialProvider:

Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: myApp.CustomCredentialProvider
at com.ibm.messagehub.login.MultiUserLoginModule$MultiUserCallbackHandler.<clinit>(MultiUserLoginModule.java:80)

Как мне изменить свою конфигурацию для стороннего модуля входа в систему JAAS, чтобы найти myApp.CustomCredentialProvider реализовано в моем streaming-service веб-приложение?


Примечание. Я уже пытался сгенерировать streaming-service.jar и добавить его непосредственно в messageHubLoginLib, Это разрешает ClassNotFoundException, но класс CustomCredentialProvider загружается полностью вне контекста моего запущенного веб-приложения и по-прежнему не дает мне доступа к моим учетным данным.

3 ответа

Вы были почти там с отдельным streaming-service.jar. Вот все шаги, которые необходимы.

  1. Определите классы (из вашего приложения), которые должны быть видны модулю входа в систему.
  2. Поместите все эти классы в ваш messageHubLoginLib (например, в отдельный streaming-service.jar)
  3. УДАЛИТЕ эти классы из вашего приложения.
  4. Настройте приложение с дочерним элементом загрузчика классов, который ссылается на библиотеку модуля входа в систему с помощью атрибута commonLibraryRef:

<webApplication id="streaming-service" location="streaming-service.war" name="streaming-service">
    <classloader commonLibraryRef="messageHubLoginLib" />
</webApplication>

Сгенерируйте streaming-service.jar и добавьте его непосредственно в messageHubLoginLib, это будет правильным способом. В этом случае у вас есть файл jar, который может использоваться совместно вашим модулем входа в систему JAAS и веб-приложением.

Однако вы сказали, что "класс CustomCredentialProvider загружается полностью вне контекста моего запущенного веб-приложения и по-прежнему не дает мне доступа к моим учетным данным". Похоже, вы пытаетесь сохранить учетные данные в классе CustomCredentialProvider для использования между модулем входа в систему и веб-приложением.

Класс CustomCredentialProvider должен быть независимым от модуля входа в систему и веб-приложения. При поступлении запроса и попытке доступа к веб-приложению сервер запускает модуль входа в систему для аутентификации. Если оно прошло, доступ к веб-приложению будет успешно.

Я не вижу вас в курсе. Может быть, вам не хватает следующей конфигурации?

<jaasLoginContextEntry id="system.WEB_INBOUND" name="system.WEB_INBOUND" loginModuleRef="KafkaClient,hashtable,certificate,token" />

Можете ли вы поместить файл jar MultiUserLoginModule и CustomCredentialProvider в каталог ${server.config.dir}/lib/global и изменить точку libraryRef на глобальный каталог в файле server.xml следующим образом:

  <jaasLoginModule className="com.ibm.messagehub.login.MultiUserLoginModule" controlFlag="REQUIRED" id="KafkaClient" libraryRef="global">
    <options credentialProvider="myApp.CustomCredentialProvider" serviceName="kafka"/>
    </jaasLoginModule>
Другие вопросы по тегам