作者: 郑 文 平 (2005.08)
内容简介:
本文首先讨论了什么是单点登录,然后分别介绍集成 IBM 的产品( Lotus Notes )和非 IBM 产品 (指运行在 WebLogic , Tomcat 等服务器上的业务系统)两类企业及应用,我们的重点在于后者。也就是说,主要解决以下几个问题:
1. 什么是单点登录 ( Single SignOn ),为什么要 SSO 。
2. Portal 与 OA 的 SSO 。
3. Portal 与普通企业及应用集成的 SSO 。这个问题是本文的核心,我们将分以下几部分来介绍:
集成企业级应用程序业务系统的原理
第一部分 什么是单点登录 ?
一、概述: Single Sign On (SSO)
严格地说,单点登录指的是允许用户登录到一个应用,这个应用带有经过认证的到其他应用的访问途径, 登录到这个应用之后,用户无需再遭遇任何其他的认证。用更实际的话来说,它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。 我们的目标是, SSO 提 供登录到 WebSphere Portal 的能力,并允许使用那些用户凭证访问 Domino 环境、 Domino 、 Sametime 、 QuickPlace 以及其他基 于 Domino 的工具;允许用户访问自己权限以内的所有企业及应用,即:运行在普通应用程序服务器上的各种业务系 统。例如,运行在 WebLogic 或者 Tomcat 上的 jsp 应用程序,运行在 IIS 上 的 asp,aspx 系统,以及 php 系 统。如果在 WebSphere Portal 和 业务系统之间没有 SSO 关系的话,那么用户每次访问某个包含来自于基于业务系统的应用程序或者服务的信息的 portlet 时,都需要登录到业务系统环境中。此外,有些 WebSphere Portal API 和服务,比如 人员在线感知 ,没有提供登录工具。即使这些服务不提供独特的登录工具,为了运行它们仍然需要通过 SSO 进行认证。我们以齐鲁石化综合数据平台为例,如果实现了单点登录,那么,一旦用户登录进入 Portal 系统,该用户就可以在不用再次登录的情况下,访问她所拥有权限的、包括 OA 和普通企业即应用程序在内的所有业务系统,如下图所示:
图 1—1 Portal 与企业级业务系统实现了 SSO
二、 SSO 的实现
我们还是以齐鲁石化综合数据集成平台为例,改企业现在存在一下四套业 务系统,包括 Lotus Notes 开发的 OA 系统,一套基于 WebLogic 的 jsp 系统,两套基于 IIS 的 asp 系统,我们就以集成这四套系统为例,简单介绍 SSO 的实现:
齐鲁石化现在这四套系统是:
图 2-1 齐鲁石化现有的应用业务系统
我们将采用如下几种方式实现 SSO:
1、 统一 LDAP 验证集成:
图 2-1 SSO 的第一种方式:统一 LDAP 验证
我们将四套业务系 统的所有用户信息一起放到 LDAP 服务器内,由 ldap 统 一对四套系统的用户进行验证。这样做比较有利于用户及权限的管理,但是也存在弊端。这四套系统是有不同的四家 IT 公司开发,用户信息放在不同平台的不同数据库中,而且这四套系统除 OA 外,各有不同的用户组群,放在一起反而不利于管理。所以,此法 SSO 虽然可行,却不适合该 Portal 系统。我们不采用这种方法。
2、 基于 Portal 系统 LDAP 的凭证保险库法
图 2-2 SSO 的第二种方法:基于 Portal 系统 LDAP 的凭证保险库法
我们采用 Portal 系统独立存在的 LDAP ,由这个 LDAP 验 证 Portal 系统用户的合法性,一旦验证通过,用户就登录进 Portal 系统。然后用户在给定权限的各个业务系统 Portlet 中存储在各个业务系统中的用户信息, Portal 系统会统一管理这些信息,然后 自动到各个业务系统的用户信息库中校验,一旦通过校验,该 portlet 就能显示业务系统的 授权信息。通常我们是在 portlet 中放入一个 Iframe ,用户在 Portal 系统中通过 portlet 中的这个 Iframe 来访问具体业务系统中的授权信息。
3、 基于 OA 系统 LDAP 的凭证保险库法 :
基本上 等同于第二种方法,不过更简单。 OA 系统是企业内部没个人都使用的业务系统,而且它已经有一套成熟的 LDAP ,我们不必再为 Portal 创建 LDAP 服务器,我们可以直接使用 OA 系统的,所以有点麻烦的是,在使用 Portal 系统的时候, OA 必须是开着的,击是你不使用 OA ,因为认证的时候是到 OA 的 LDAP 服务其中验证的。其他方面则与第二种方法完全相同。
第二部分、 Portal 与 OA 的 SSO
一、 SSO 是如何工作的 ?
WebSphere Portal 和 Lotus Domino 之间的单点登录是通过一种称为轻量级第三方认证 (LTPA) 的机制来实现的。 WebSphere 应用服务器(还包括 WebSphere Portal 和其他任何运行在 WebSphere 环境中的应用程序)和 Domino 都使用 LTPA 。当 LTPA 机制用于由多个服务器 组成的环境中时,它是通过使用 Domain Cookie 而启用的。这种经过加密的会 话 cookie 被放置在用户浏览器中,并包含了一些信息, WebSphere 或者 Domino Application 服务器可以加密这些信息,并使用这些信息来说明用户已经通过该 cookie 所覆盖的 DNS ( Domain Naming Service ,域名服务)域中的认证。
LTPA cookie 包含以下 信息:
· Cookie 名称:总是设置为 LtpaToken 。
· 域:设置为 Internet 域,该域由参与单点登录的所有服务器所共享(例如: mycompany.com )。
· Cookie 到期:设置为当浏览器的寿命终止时删除该 cookie 。
· 安全:设置为开状态,以强制使用安全套接字层 (SSL) 。有一个 LTPA 配置有一个设置参 数,使它创建只通过 SSL 发送的 cookie 。
· Cookie 值:这被设置为 LTPA 标记,接下来会对其进行描述。
LTPA 标记是一个加密的字符串, 它包含以下信息:
· 用户数据:一般被设置为用户 ID ,但也可以是任何用于惟一标识用户的用户信息。
· 过期时间:与 Cookie 过期不同,这个字段用于强加一个时间限制,时间限制从登录进来的那一刻算起,而不受浏览器活动或者不活动所影响。这个时间限制是一个可配置的 LTPA 设置,缺省情况下为 30 分 钟。
二、 SSO 的集成效果:
我们可以把整个 OA 系统作为一个整体,即一个 Portlet 集成进 Portal 系统,也可以根据 OA 内不同的文件数据库 (.nsf) 俺功能拆分为各个不同的功能单元,每个功能单元作为 一个单独的 portlet 集成进 Portal 系统。例如,
图 3-1 将 OA 系统拆分为功能单元独立集成进 Portal
三、怎样实现 OA 与 Portal 的 SSO ?
Portal 与 OA 的 SSO 可以通过配置 ltpa 的方法实现。通俗一点讲就是:用户登录 Portal 后, Portal 系统会把用户登录信息加密成 ltpa 并存放到某一位置,当用户继续访问 OA 中的授权资源时, OA 系统会自动读取改位置的 ltpa ,读到并解密后拿到 OA 系统中验证,如果验证通过,则显示给用户他要的授权信息。所以要配置 Portal 与 OA 之间的 SSO 非常容易,只要先将 OA 系统服务器的 ltpa 导出并存为 .key 文件,然后导入 Portal 系统所在的服务器( WebShpere Application Server )中就可以了。
第三部分 Portal 系统与普通应用程序的 SSO
一、概述
WebSphere Portal 提 供了 Credential Vault (凭证保险库)功能。 Credential Vault 通过 Basic Authentication Header 将用户名和密码传递给后端应用程序。为了使 Domino 服务器接受通过这个头部传递进来的凭证,必须将服务器会话验证配置为 Single-Server 模式。在 Multi-Server 模 式中,该服务器将会只接受通过 LTPA 机制传递的凭证。因此,为了与 Domino 应用程序一起使用用于 SSO 的 Credential Vault ,您必须将 Domino 服务器会话验证配置为 Single-Server 模式。
要使用 Credential Vault ,用户需输入一些凭证,输入一次就够了。随后,这些凭证被存放在一个经过加密的数据库表中,每当用 户访问该 portlet 时,这些凭证便被传递给后端应用程序。要了解关于配置 Credential Vault 的细节,参见 WebSphere Portal InfoCenter 。
二、凭证保险库实现 SSO 原理
我们以一个最简单的 SSO 过程为例介绍:
1 .普通业务系统的登录过程:
系统首先提供一个界面让我们输入我们在应用程序中的用户信息:
… …
<form name=’login’ action=”chech_login.jsp” method=”POST”>
<input type=”lable”> 请输入您的用户名: </lable>
<input type=”text” name=”username” id=”username” length=”10”></text>
<input type=”lable”> 请输入您的密码: </lable>
<input type=”password” name=”password” id=”password” length=”10”></text>
<input type=”submit” value=” 登录 ”>
<input type=”reset” value=” 取消 ”>
</form>
2 .用户输入用户名和密码后,点击“登录”按钮,该页面提交到 form 所对应的 Action ( check_login.jsp )处理,我们看 check_login.jsp 的代码:
… …
<%
String username=request.getParamenter(“username”);
String password=request.getParamenter(“password”);
……
接下来提交到数据库验证用户信息的合法 性,如果合法,定位到授权信息页面;否则,重定位回到登录页面 login.jsp 。
%>
3. Portlet 开发中是如何解决这个问题的?
其实起关键作用的还是 check_login.jsp 页面,它需要获得用户名和密码两个键值,然后拿着两个参数到后台数据库去验证。常规登录方式中这两 个参数是通过 login.jsp 来获得的。事实上,只要 portlet 能为该页面提供这两个键值,也就是先了登录的自动化。而 portlet 要实现这两个参数的提供是非常简单的,所以实现单点登录也就非常简单了。我们可以复制一个 check_login.jsp 文件,例如 check_portal_login.jsp, 这个页面的两个参数是 portlet 提供的。剩下的事完全交给业务系统去处理,页面流转和全县控制都不用我们管了。
三、开发 Portlet 实现 SSO 的方法
1 、 JSP 取值传送 URL 法。
顾名思义,我们开发一个使用系统专用槽的 portlet ,使用凭证保险库相关接口在 PortletView.jsp 中取出用户存储在凭证保险库中的键值,然后以 URL 的 方式传送到 Iframe 内。例如:
〉〉〉〉〉〉〉 PortletView.jsp 中的部分代码:
<%
String userId =viewBean.getUserId();
String password=viewBean.getPassword();
if( userId.length()>0 ) {
String url = http://hostname:8080/check_portal_login.jsp ;
url+=”?username="+userId+"&password="+password;
%>
<Iframe src="<%=url%> " align="left" width=100% frameborder=no marginheight="2" scrolling="auto" marginwidth="2" height=600></Iframe>
如果用户已经在凭证高先库中存储了键值的话,该 portlet 的 view 页面被初始化时, Iframe 中将显示用户成功登录后的授权信息,也就是实现了 SSO 。
2 、 Class 取值写 Session 法。
顾名思义,我们在 Portlet 的控制类中取得用户存储在凭证保险库中的键值对,并在 PortletView 的 doview() 方法中写入 Session. 而专为 portal
作者简介:郑文平,“神狐”软件工作室创立者,IBM WebSpher Portal产品开发人员,原北京东华合创软件院软件工程师,Portal信息化专员,长期从事Portal(尤其是IBM Websphere Portal)开发,曾参与并引领了北京驰普企业门户、山东新汶矿务局远程调度系统、中国石化齐鲁公司综合数据平台、北京供电局虚拟门户产品,北京航信企 业门户等多个Portal项目的开发。
如果您有以下需要,欢迎您与SagFox SoftWare 联系:
1、如果您的公司有IBM WebSpher Portal 项目需要实施但缺少必需的技术力量,而您又不愿安排工程师们边学习边开发而影响项目质量,欢迎您把项目外包给 SagFox SoftWare,或者以项目合作的方式联合开发。
2、如果您们是一个Java 开发者并打算投身Portal领域,欢迎您接受 SagFox SoftWare 针对公司技术人员的开发培训,SagFox SoftWare 同时开展针对个人的技术指导与职业规划,助您谋得高薪。
3、 如果您是一个娴熟的Portal开发者,欢迎您加盟SagFox SoftWare,我们的团队正在飞速发展。我们也欢迎入门者加入我们的讨论组,SagFox SoftWare 尽力解答欠成熟开发者的提问,并以提携后起者为乐趣,希望国内的门户实施少一些“豆腐渣”工程,我们愿贡献一点力量。
您可以通过 zhengwp@cn.ibm.com 或者 zhengwenping@126.com 与SagFox SoftWare取得联系。本文作者的msn是: zhengwp@cn.ibm.com