在门户项目中,经常会遇到如何实现单点登录的问题,下面就本人的经验做个总结。欢迎大家进行补充讨论。 单点登录的具体实现有很多种选择,包括:
- 采用专门的sso商业软件: 主要有:netgrity的siteminder,已经被ca收购。novell 公司的ichain。rsa公司的cleartrust等。
- 采用门户产品供应商自己的sso产品,如:bea的wles,ibm 的tivoli access manager,sun 公司的identity server,oracle公司的oid等。
- 这些商业软件一般适用于客户对sso的需求很高,并且企业内部采用cots软件如:domino,sap,sieble的系统比较多的情况下采用。并结合身份管理。统一认证等项目采用。采用这些软件一般都要对要集成的系统做些改造,如在要集成的系统上安装agent。现在一般只提供常见软件如:domino,sap,sieble,常见应用服务器:weblogic,websphere等的agent。要先统一这些系统的认证。一般采用ldap或数据库。然后才能实现sso。比较麻烦。
- 另外,如果不想掏银子,也有open source的sso软件可选:主要有:http://www.josso.org/ https://opensso.dev.java.net/ http://www.sourceid.org 等。具体怎么样就不清楚了。
如果项目对sso的要求比较低,又不想对要被集成的系统做任何改动,可采用下面介绍的方式简单实现:下面我们通过一个例子来说明。假如一个门户项目要对下面的几个系统做sso。

用户在这些系统中的用户名,密码各不相同,如:员工号为001的员工在这些系统中的用户名,密码分别如下:
| 用户 | 系统 | 用户名 | 密码 |
|---|---|---|---|
| 001 | portal系统 | a | 1234 |
| 001 | 邮件系统 | b | 2345 |
| 001 | domino系统 | c | aaaa |
| 001 | 报销系统 | d | cccc |
| 001 | 工资系统 | e | bbbb |
首先,建立员工在portal系统中的用户名和其他系统中的用户名之间的对应关系
首先,要建立员工在portal系统中的用户名和其他系统中的用户名之间的对应关系并保存。可保存在表中或ldap中或文件系统中。当然要考虑这些系统之间的数据同步问题。比较好的方式是找到用户在这些系统中的都存在的唯一信息(如员工号,mail地址,姓名等)。通过唯一信息实时到各个系统中去取认证所需要的信息。就不需要考虑数据同步问题。比较实用。可以建立类似下面的表:密码可采用加密保存。如果是采用bea的weblogic portal,可采用uup来保存这些信息。
(
user
varchar2(20),
/*用户名*/
app_name varchar2(20),
/*应用系统*/
architect varchar2(4),
/*应用系统的架构bs或cs*/
app_company varchar2(50),
/*用户所属分公司*/ app_department varchar2(50),
/*用户所在的部门*/ app_user varchar2(15),
/*在该系统中的用户名*/
app_passwd varchar2(15),
/*在该系统中的密码*/
app_cookie varchar2(30),
/*cookie名称*/
form_user varchar2(20),
/*认证页面中form的用户名字段*/
form_passwd varchar2(20),
/*认证页面中form的密码字段*/
app_special varchar2(20)
/*其他*/ );
通过iframe或超连接方式集成目标系统,并进行sso
通过iframe或超连接方式集成目标系统,并在url中带上用户名和密码。如集成domino可采用如下方式:
width=" >
或:
href src=“http:// host1/names.nsf?login&username=admin&password=pass&redirectto=/names.nsf”
以上采用的是在http中直接传递明码,为提高安全性,可采用https来传递用户名和密码。另外采用这种方式被集成的系统必须支持form方式认证。j2ee应用,domino等都支持form认证。
这两种方式如果sso成功,就自动进入目标系统的界面,如果实现会显示目标系统的登录界面。其效果图如下:

这种方式,必须维护对应关系表,如上面的sso_info。更好的方式是提供界面,让最终用户自己维护这种对应关系,可模仿compoze portlets for lotus的做法,在用户第一次进入要与之做sso的系统时,如domino系统,显示一个界面,让用户自己输入他在该系统中的用户名/密码等信息。并保存到表中或ldap等其他数据源中。以后用户要进入这些系统时,就直接从表中或其他数据源中取用户的用户名/密码等信息,帮助用户做认证。建议采用这种方式。如下图所示。如果用户改变了自己在domino系统中的用户名,密码。从门户系统进入domino系统时,认证会失败,就重新显示类似下面的界面。让用户重新输入他在domino系统中新的用户名,密码并保存。

以上这种实现方式,一般需要浏览器支持cookie,所以要注意浏览器的配置,在开发阶段,为方便调试,可设置ie,让它显示cookie的名称。如下所示:

采用这种方式,对要集成的系统不需要做任何的改动。如果portal系统中的用户在被集成的系统中的权限都一样,可采用建立一个通用用户的做法。也就是所有在portal系统中的用户都采用这个通用用户进入目标系统。这种方式等于是采用页面集成方式做集成。比较方便使用。另外,有时候需要采用调用api,或配置adapter等应用集成方式来集成其他系统,一般也是通过定义一个连接专用的用户。在api中或在配置adapter的时候写死。如采用java api方式集成domino:
lotus.domino.session dominosession = notesfactory.createsession(dominoserver, “admin”, “password”);
cs结构实现方式
经常有人问cs结构的应用如何实现sso,本人的建议是对这种系统不要自己去实现sso。很麻烦,其实输个用户名,密码没什么大不了的。如果要实现,一是采用商业软件。另外也可以采用以下方式:在portal的portlet上建立超连接。并通过applet方式启动cs结构的应用系统的登录界面。然后通过如下的方式把用户名/密码传递过去。
-不能做任何改动的客户端- win消息(给登录窗口发送用户名,密码等登录所需要的信息),模拟键盘(java有模拟键盘输入的api)
-可以做改动的客户端- 参数传递,并让登录的exe文件读取参数进行认证。
因为要让applet执行本地的exe文件,所以必须对ie中的jre的安全进行设置。

其他:
在采用以上方式实现了sso后,要注意logout,可采用与login相同的方式。也可以通过被集成系统的超时设置来实现。
单点登录sso技术资料收集
- 统一用户认证和单点登录解决方案: 计算机世界网上的文章,比较全面的介绍统一用户认证和单点登录解决方案
- 惠普灵动单点登录(sso)解决方案: 包括c/s结构的系统单点登录解决方案
- 网站用户单点登录系统解决方案: 通过令牌方式实现网站用户单点登录
- weblogic平台的web sso(saml)解决方案: 在weblogic 8.1sp4中,提供了用于和microsoft windows客户端进行sso的single pass negotiate identity assertion provider。本文对其做了详细的介绍。
- http://blog.beijingnet.com/index.php?blogid=4: 收录了一些sso方面的文章
- 应用整合中sso的技术实现: 作者介绍了南京地税进行应用整合sso的技术实现方案

作者简介dev2dev id: xcjing,bea 资深技术顾问,加入bea中国多年,在门户技术、rfid解决方案上有着丰富的经验。
闽公网安备 35060202000074号