В этой статье описывается пошаговая процедура написания клиента Web-сервиса с последующим его конфигурированием (с использованием макроса IBM Rational Host On-Demand) для извлечения учетных данных из Web-сервиса и предоставления их в экранный сеанс. Эта же идея может быть применена для получения любых данных из Web-сервиса для автоматического заполнения экранов терминала.
Введение
IBM Rational Host On-Demand - это приложение эмулятора терминала, которое можно использовать для подключения к хост-приложениям, работающим на IBM i (5250), IBM System z (3270) и других UNIX терминалах. Оно обеспечивает экономически эффективный и безопасный браузерный и небраузерный доступ к хосту для пользователей в интра- и экстрасетях. Приложение может быть установлено на Web-сервере, что упрощает административное управление и развертывание. Кроме того, его апплет загружается в клиентский браузер или рабочую станцию, предоставляя пользователю подключение к критически важным приложениям и данным хоста. Это Web-to-host решение Rational для сетевого подключения обеспечивает без какого-либо программирования браузерный доступ с развитой защитой к приложениям хоста из Интернета.
Обзор
Существующая в Rational Host On-Demand поддержка единого входа (Single Sign-On - SSO) при помощи макросов ограничивается Portal Server и Credential Mapper Servlet. Несмотря на то, что в макросах есть много собственных возможностей, позволяющих непосредственно реализовать интеграционное решение для выполнения единого входа с помощью Web-сервисов, до сих пор макросы Rational Host On-Demand не исследовались в этом направлении. Данная статья направлена на то, чтобы помочь администраторам и пользователям Rational Host On-Demand понять гибкость макросов Rational Host On-Demand и научиться самостоятельно программировать макросы для выполнения единого входа при помощи Web-сервисов.
В этой статье рассматриваются следующие вопросы:
- Написание макроса SSO, который, в свою очередь, будет вызывать клиент Web-сервиса.
- Пример кода клиента Web-сервиса, который получает учетные данные из Web-сервиса, работающего на сервере приложений.
- Пример кода Web-сервиса, генерирующего идентификатор и пароль пользователя.
Кроме того, эту же идею можно применить при разработке более сложных макросов, использующих Web-сервисы для автоматического заполнения экранов терминала данными, извлеченными из базы данных или какого-либо другого источника.
Архитектура развертывания
На рисунке 1 показана структура Rational Host On-Demand и Web-сервиса SSO.
Рисунок 1. Архитектурный поток
Ниже приведены этапы процесса.
- Клиент (конечный пользователь) Rational Host On-Demand загружает HTML-файл, а также архивные файлы Java™ (JAR-файлы, в том числе дополнительные JAR-файлы, необходимые для выполнения кода клиента Web-сервиса).
- Двойным щелчком по пиктограмме сеанса открывается экранный сеанс, а затем запускается макрос (SSOwebService.mac).
- Макрос, как часть элемента actions вызывает метод объекта клиента Web-сервиса SSO, чтобы получить имя пользователя.
- Далее клиент Web-сервиса SSO подключается к Web-сервису SSO, развернутому на движке веб-сервисов (Apache Axis2), и получает имя пользователя.
- Макрос, как часть следующего элемента actions, вызывает второй метод объекта клиента Web-сервиса SSO и получает пароль.
- Клиент Web-сервиса SSO подключается к Web-сервису SSO, развернутому на механизме исполнения Web-сервисов, и получает пароль.
- Макрос завершает вызов методов Web-сервиса и переходит к выполнению дальнейших действий.
- На экране входа в систему макрос во время выполнения заполняет поля имени пользователя и пароля, а затем имитирует нажатие Enter.
- Данные отправляются на хост, и происходит автоматический вход в систему без ручного ввода учетных данных на экране.
Макрос ввода учетных данных
В приведенных ниже листингах показан пример макроса ввода учетных данных. В листинге 1 класс клиента Web-сервиса включен в макрос с помощью тега import
, а WSClient - это имя, присвоенное ему.
Листинг 1. Импорт класса клиента (WSClient) Web-сервиса
<HAScript name="SSOwebService" description="Single Sign-On using web Service"
timeout="60000" pausetime="300" promptall="true" blockinput="false"
author="Suneel - Mahesh " creationdate="Aug 21, 2010 1:38:43 PM"
supressclearevents="false" usevars="true" ignorepauseforenhancedtn="true"
delayifnotenhancedtn="0" ignorepausetimeforenhancedtn="true">
<import>
<type class="com.ibm.developerWorks.HOD.HODCredentialServiceClient"
name="WSClient"/>
</import>
|
В листинге 2 переменная webService
содержит URL Web-сервиса, а переменная SSO
указывает на объект клиента Web-сервиса.
Листинг 2. Создание переменных и экземпляра класса
<vars>
<create name="$webService$" type="string"
value="'http://localhost:8080/axis2/services/HODCredentialGenerator'" />
<create name="$SSO$" type="WSClient" value="$new WSClient($webService$)$" />
</vars>
|
В листинге 3 SSO.getUserID()
и SSO.getPassword()
получают от Web-сервиса имя пользователя и пароль соответственно, а затем значения выводятся на экран.
Листинг 3. Определение действий action и получение учетных данных
<screen name="Screen1" entryscreen="true" exitscreen="true" transient="false">
<description >
<oia status="NOTINHIBITED" optional="false" invertmatch="false" />
</description>
<actions>
<input value="$SSO.getUserID()$" row="6" col="53" movecursor="true"
xlatehostkeys="true" encrypted="false" />
<input value="'[tab]'" row="0" col="0" movecursor="true"
xlatehostkeys="true" encrypted="false" />
<input value="$SSO.getPassword()$" row="7" col="53" movecursor="true"
xlatehostkeys="true" encrypted="false" />
<input value="'[enter]'" row="0" col="0" movecursor="true"
xlatehostkeys="true" encrypted="false" />
</actions>
<nextscreens timeout="0" >
</nextscreens>
</screen>
</HAScript>
|
Клиент Web-сервиса
HODCredentialServiceClient.java является клиентом Web-сервиса, который подключается к Web-сервису, развернутому (в данном случае) на механизме исполнения Web-сервисов Apache Axis2.
При этом используется клиентская заглушка (сгенерированная плагином Axis2 для Eclipse). Макрос Rational Host On-Demand создает экземпляр класса и вызывает методы для получения имени пользователя и пароля. После создания экземпляра класса клиент Web-сервиса получает имя текущего пользователя, как показано в листинге 4. Оно будет использоваться в качестве ключа для получения учетных данных из Web-сервиса.
Листинг 4. Код клиента Web-сервиса
/* Пример программы для IBM developerWorks
*
* Автор(ы): Сунил, Махеш
*/
package com.ibm.developerWorks.HOD;
import java.rmi.RemoteException;
import org.apache.axis2.AxisFault;
public class HODCredentialServiceClient {
String key;
//клиентская заглушка, сгенерированная плагином Axis2 для Eclipse
HODCredentialGeneratorStub stub;
//принимает URL Web-сервиса из макроса
public HODCredentialServiceClient(String webService){
//получить текущего пользователя системы из java.
//Мы будем использовать это значение в качестве ключа для получения
//учетных данных
key = System.getProperty("user.name");
try {
stub = new HODCredentialGeneratorStub(webService);
} catch (AxisFault e) {
e.printStackTrace();
}
}
//метод для получения идентификатора пользователя из Web-сервиса
public String getUserID(){
HODCredentialGeneratorStub.GetUserID userIDKey =
new HODCredentialGeneratorStub.GetUserID();
HODCredentialGeneratorStub.GetUserIDResponse userIDResponse = null;
//установить ключ для запроса идентификатора пользователя из Web-сервиса
userIDKey.setKey(key);
try {
userIDResponse = stub.getUserID(userIDKey);
} catch (RemoteException e) {
e.printStackTrace();
}
return userIDResponse.get_return();
}
//метод для получения пароля из Web-сервиса
public String getPassword(){
HODCredentialGeneratorStub.GetPassword passwordKey =
new HODCredentialGeneratorStub.GetPassword();
HODCredentialGeneratorStub.GetPasswordResponse passwordResponse = null;
//установить ключ для запроса пароля из Web-сервиса
passwordKey.setKey(key);
try {
passwordResponse = stub.getPassword(passwordKey);
} catch (RemoteException e) {
e.printStackTrace();
}
return passwordResponse.get_return();
}
}
|
Web-сервис учетных данных
Это Web-сервис, выполняющийся на механизме выполнения Web-сервисов, который предоставляет необходимые учетные данные в клиентскую программу. Логика реализации может любая, начиная от формирования учетных данных при помощи генератора случайных чисел или неформатированного файла и до чтения из базы данных.
Поскольку логика создания учетных данных выходит за рамки данной статьи, в статье содержится скелетная программа, содержащая методы, которые необходимо реализовать для использования с клиентом.
Пример HODCredentialGenerator.java, приведенный в листинге 5, принимает в качестве входных данных ключ и предоставляет требуемое имя пользователя или пароль, основываясь на значении ключа. Его можно развернуть как Web-сервис при помощи плагина Axis2 для Eclipse.
Приведенный здесь пример максимально упрощен, чтобы проиллюстрировать возможности расширения макросов Rational Host On-Demand. При реализации SSO рекомендуется применять дополнительную защиту. Например, можно с помощью HTTPS создать защищенный канал между клиентом Web-сервиса и Web-сервисом или модифицировать Web-сервис для шифрования пароля с соответствующей логикой дешифрования в клиенте Web-сервиса.
Листинг 5. Код Web-сервиса
/* Пример программы для IBM developerWorks
*
* Автор(ы): Сунил, Махеш
*/
package com.ibm.developerWorks.HOD;
public class HODCredentialGenerator {
public String getUserID(String key){
// логика для получения имени пользователя на основе вводимого здесь ключа
return "uname";
}
public String getPassword(String key){
//логика для получения пароля на основе вводимого здесь ключа
return "password";
}
}
|
Интеграция с клиентом Rational Host On-Demand
Создание JAR-файла
Создайте JAR-файл (hodwsclient.jar) с клиентом Web-сервиса и вспомогательными файлами класса-заглушки, подписав его действительным сертификатом.
Создание файла мастера развертывания с HTML-параметром
- Откройте мастер Rational Host On-Demand Deployment Wizard и создайте новую HTML-страницу с необходимым определением хоста.
- В Session Properties > Start Options настройте макрос входа в систему на автозапуск с сеансом. Предыдущий макрос записан для сеанса с первым экраном как экран входа в систему.
- В панели Additional Options выберите Advanced Options > HTML parameters и добавьте HTML-параметр следующим образом (см. рисунок 2):
- Parameter Name: AdditionalArchives
- Parameter Value: список JAR-файлов через запятую и без расширения .jar
- Список JAR-файлов должен включать JAR, который содержит класс клиента Web-сервиса и все необходимые вспомогательные JAR-файлы. Вспомогательные JAR-файлы могут включать JAR-файлы, необходимые для класса заглушки.
- В случае, если заглушка сгенерирована плагином axis2, список JAR-файлов включают в себя:
- hodwsclient
- axiom-api-1.2.7
- axiom-impl-1.2.7
- axis2-1.4.1
- backport-util-concurrent-3.1
- commons-codec-1.3
- commons-httpclient-3.1
- commons-logging-1.1.1
- neethi-2.0.4
- woden-api-1.0M8
- wsdl4j-1.6.2
- XmlSchema-1.4.2
Рисунок 2. Панель Add HTML parameters в Rational Host On-Demand Deployment Wizard
- Продолжайте создание HTML-страницы.
Доступ к странице
- В браузере с поддержкой Java откройте HTML-файл, созданный на предыдущих шагах, и войдите в сеанс Rational Host On-Demand, для которого настроен макрос ввода учетных данных.
- Экран входа в систему будет автоматически заполнен учетными данными, предоставляемыми Web-сервисом, как показано на рисунке 3.
Рисунок 3. Экран единого входа (SSO) в систему
Что вы узнали
Теперь вы знаете, как написать клиент Web-сервиса, а затем настроить его с помощью макроса Rational Host On-Demand для извлечения учетных данных из Web-сервиса и их последующего ввода в экранный сеанс на вашем терминале.
Кроме того, эту же идею можно применить при разработке более сложных макросов, использующих Web-сервисы для автоматического заполнения экранов терминала данными, извлеченными из базы данных или какого-либо другого источника.
Загрузка
Описание |
Имя |
Размер |
Метод загрузки |
Файлы классов и jar |
Binaries.zip |
137 KБ |
HTTP |
Исходные файлы Java и макроса |
Source.zip |
137KБ |
HTTP |