Загрузка классов для пользовательских модулей входа в систему 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. Вот все шаги, которые необходимы.
- Определите классы (из вашего приложения), которые должны быть видны модулю входа в систему.
- Поместите все эти классы в ваш messageHubLoginLib (например, в отдельный streaming-service.jar)
- УДАЛИТЕ эти классы из вашего приложения.
- Настройте приложение с дочерним элементом загрузчика классов, который ссылается на библиотеку модуля входа в систему с помощью атрибута 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>