IBM Rational Host On-Demand: единый вход (SSO) с использованием Web-сервисов

Источник: IBM

В этой статье описывается пошаговая процедура написания клиента 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. Архитектурный поток
Рисунок 1. Архитектурный поток

Ниже приведены этапы процесса.

  1. Клиент (конечный пользователь) Rational Host On-Demand загружает HTML-файл, а также архивные файлы Java™ (JAR-файлы, в том числе дополнительные JAR-файлы, необходимые для выполнения кода клиента Web-сервиса).
  2. Двойным щелчком по пиктограмме сеанса открывается экранный сеанс, а затем запускается макрос (SSOwebService.mac).
  3. Макрос, как часть элемента actions вызывает метод объекта клиента Web-сервиса SSO, чтобы получить имя пользователя.
  4. Далее клиент Web-сервиса SSO подключается к Web-сервису SSO, развернутому на движке веб-сервисов (Apache Axis2), и получает имя пользователя.
  5. Макрос, как часть следующего элемента actions, вызывает второй метод объекта клиента Web-сервиса SSO и получает пароль.
  6. Клиент Web-сервиса SSO подключается к Web-сервису SSO, развернутому на механизме исполнения Web-сервисов, и получает пароль.
  7. Макрос завершает вызов методов Web-сервиса и переходит к выполнению дальнейших действий.
  8. На экране входа в систему макрос во время выполнения заполняет поля имени пользователя и пароля, а затем имитирует нажатие Enter.
  9. Данные отправляются на хост, и происходит автоматический вход в систему без ручного ввода учетных данных на экране.

Макрос ввода учетных данных

В приведенных ниже листингах показан пример макроса ввода учетных данных. В листинге 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-параметром

  1. Откройте мастер Rational Host On-Demand Deployment Wizard и создайте новую HTML-страницу с необходимым определением хоста.
  2. В Session Properties > Start Options настройте макрос входа в систему на автозапуск с сеансом. Предыдущий макрос записан для сеанса с первым экраном как экран входа в систему.
  3. В панели Additional Options выберите Advanced Options > HTML parameters и добавьте HTML-параметр следующим образом (см. рисунок 2):
    • Parameter Name: AdditionalArchives
    • Parameter Value: список JAR-файлов через запятую и без расширения .jar
  4. Список JAR-файлов должен включать JAR, который содержит класс клиента Web-сервиса и все необходимые вспомогательные JAR-файлы. Вспомогательные JAR-файлы могут включать JAR-файлы, необходимые для класса заглушки.
  5. В случае, если заглушка сгенерирована плагином 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

    Рисунок 2. Панель Add HTML parameters в Rational Host On-Demand Deployment Wizard 

  6. Продолжайте создание HTML-страницы.

Доступ к странице

  1. В браузере с поддержкой Java откройте HTML-файл, созданный на предыдущих шагах, и войдите в сеанс Rational Host On-Demand, для которого настроен макрос ввода учетных данных.
  2. Экран входа в систему будет автоматически заполнен учетными данными, предоставляемыми Web-сервисом, как показано на рисунке 3.

    Рисунок 3. Экран единого входа (SSO) в систему
    Рисунок 3. Экран единого входа (SSO) в систему

Что вы узнали

Теперь вы знаете, как написать клиент Web-сервиса, а затем настроить его с помощью макроса Rational Host On-Demand для извлечения учетных данных из Web-сервиса и их последующего ввода в экранный сеанс на вашем терминале.

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

Загрузка

Описание

Имя

Размер

Метод загрузки

Файлы классов и jar Binaries.zip 137 KБ HTTP 
Исходные файлы Java и макроса Source.zip 137KБ HTTP 


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=26965