IBM Portal 开发系列讲座:
IBM Portal与单点登录、集成企业级应用
作者: 郑 文 平 (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