《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > JAAS在单点登录系统中的应用

JAAS在单点登录系统中的应用

2009-02-25
作者:赵东辉,张曦琼,李俊

1 引言
随着电子商务和电子政务系统的普及,越来越多的公司或机构面临着同样的尴尬,公司内运行着多套系统,每个系统都是一个孤岛,有自己的认证和访问策略。对用户来说,各系统都需要输入用户名,密码,不仅麻烦,而且降低了系统的安全性。为解决这对矛盾,产生了单点登录(Single Sign On,SSO[1,2])的概念。所谓单点登录的核心思想是通过一定的方式使得提供服务的各网站之间建立某种联系,提供了允许用户只需一次登录到站点的内建机制或者上下文环境,在登陆相互联系的多个网站时只需要进行一次验证即可,从而保持了应用外观的无缝性,对用户的透明性。
2 传统认证方法比较
单点登录系统的核心模块就是其访问控制模块,不同的实现方案,采取的策略不同或者基于不同的安全标准。有的基于Kerberos[3]认证协议,有的利用windows NT的LDAP(Lightweight Directory Access Protocol),也有的基于Solaris NIS网络信息服务的认证。虽然有不少产品是利用java开发的,但无论Servlet还是EJB的规范都没有明确定义如何来实现SSO,即使在授权方面,也没有明确的解决方案。我们可以在J2EE的蓝皮书中看到对于同一个例子:Java Pet Store的访问控制的几个不同的解决方案,各有其优缺点。
在1.0.1版本中,使用基于表单的认证方式,这是我们在web或者电子商务开发中常用的方式。当用户到达一个不被授权访问的资源时,web容器就推出一个html页面,要求输入用户名和密码,其缺点就是:可移植性差[6]。
在1.1.2版本中,采用了基于Servlet的架构,基于Servlet的Sign in/Sign out来集中处理所有的request请求,来代替form-based架构的访问控制,这样可以使访问控制模块的代码移植到所有支持J2EE平台的应用上,而无需修改代码。缺点是必须由应用程序自己来处理。
在版本1.3中 ,采用了Filter来实现。利用Filter来阻止未授权的访问。在这种方案中,Filter过滤所有的HTTP请求和响应。如成功登录,在用户的session中,设置一个标记,Filter在每次响应前检查该标记是否为真。因为过滤所有的HTTP请求和响应,导致响应不及时,增加了响应时延。
如果我们想开发一个可重复利用的、移植性好的SSO模块,以上的三种方案,都不可行。本文利用在J2SE 1.4及以后的版本中推出的JAAS[4](Java Authentication Authorization Service)可以很好的解决这个问题。
3 JAAS概述
3.1 JAAS概述
JAAS在J2SE 1.3版本中还是一个可选的包,现在已经集成到J2SE 1.4版本中,是1.4及以上版本的标准类库。伴随着J2SE1.5版本的发布,更包含了许多诸如加密技术、XML安全性、公钥机制(PKI)、Kerberos和结盟认证(the federating identity)的增强,JAAS在J2EE实现中扮演一个越来越重要的角色。
JAAS框架是从各种不同的安全框架和技术发展而来的,JAAS 的可堆叠和可插接功能基于 Unix 的可插接验证模块 (Pluggable Authentication Module, PAM) 框架。完全遵循 Java Cryptography Architecture(Java 加密体系结构,JCA)框架体系结构,它允许通过 Service Provider Interface(服务提供接口,SPI)安插多种安全机制,实现了一个Java版本的可插入式验证模块(Pluggable Authentication Module,PAM),在实现方面具有独立性和互操作性,在算法上具有独立性和可扩展性。这就使得上层的应用程序与底层所使用的各种验证技术保持相对独立,新的或修改后的验证技术能够方便地部署到应用程序而不需要修改应用程序的代码。同时,JAAS 还引用了二个阶段的提交协议中的的事务行为和 J2SE 1.2 安全包中的安全配置概念。因此,JAAS 是多种技术和概念的精华,它代表了 Java 编程语言的发展方向。
JAAS API 包含两个方面的安全内容,即认证和授权认证是一种通过可靠的方式确定谁是 Java 代码执行者的方法;而授权是一种确保该人具有执行某种给定任务权限的方法。在本文中,我们结合SSO重点讨论JAAS的认证部分。
3.2 JAAS认证机制
认证就是校验一个用户拥有使用已经被企业用户注册机构证明了的身份鉴定的权限的处理过程。JAAS的认证机制建立于一整套插拔" title="可插拔">可插拔的模块(参看图1)基础上。JAAS允许不同的验证模型(SUN提供了几个默认的LoginModule ,在sun.com.security.auth.module包里有诸如JndiLoginModule,Krb2LoginModule,UnixLoginModule和NTLoginModule等module,也可以自定义module)在运行时可被插拔。客户应用总是通过LoginContext和JAAS交互。
典型的认证处理过程要经过下面的步骤:
1. 创建登录环境,生成一个LoginContext对象。
LoginContext ctx=new LoginContext(“MyApp”);
LoginContext寻找配置文件以决定使用那个LoginModule,也有可能传递一个回调处理程序对象CallbackHandler给LoginContext以搜集用户验证信息如用户名和口令,作为选择。
2. 通过调用LoginContext的login方法执行认证,它会加载预定义的LoginModule去检验是否用户可以被认证。
3. 如果用户被认证,那么用规则和标识和其属性进行关联, 或者在登陆失败的情况下抛出一个LoginException。
 使用LoginContext的logout方法进行注销登陆。

            

                                     图1 JAAS的可插拔模块认证机制概览图
在JAAS中,登陆是一个两阶段(Two-phase)的处理过程。第一阶段是login阶段(就像上面2所描述的)。这个阶段唯一的任务是认证。只要处理过程成功通过这个阶段,认证处理过程就进入了“提交(commit)”阶段(如上步骤3),这一阶段LoginModule的commit方法被调用去关联所属子项相关的规则和标识。
在所有的认证模块当中,LoginModule是事实上的认证机制的借口。虽然LoginModule决没有得到直接调用客户应用的机会,但是他经由一个可插拔的模块提供了一个认证的具体类型,其实现了认证的算法并且决定实际的认证过程是怎样被执行的。
JAAS认证结构体系是可扩展的,所以只要在配置文件中指定使用哪个LoginModule模块就可以几乎全部插入任何LoginModule模块,如下例所示:
MyApp{
Com.exercise.jaas.module.myLoginModule required debug=ture;
};
这里MyApp是LoginContext的名字,当你生成一个新的LoginContext开始认证过程时它会被传入LoginContext的构造函数中。依据配置文件,提醒JAAS有关LoginModule在登录过程中应该被用来执行认证(此config文件表明myLoginModule将被使用)。
Required参数及其备选参数用于指定一个给定的验证过程的成功或失败对总体验证过程的影响:
1)required表示登录模块必须成功。即使它不成功,还将调用其它登录模块。
2)optional表示登录模块可以失败,但如果另一个登录模块成功,总体登录仍可以成功。如果所有登录模块都是可选的,那么要使整个认证成功至少必须有一个模块是成功的。
3)requisite表示登录模块必须成功,而且如果它失败,将不调用其它登录模块。
4)sufficient表示如果登录模块成功,则总体登录将成功,同时假设没有其它必需或必不可少的登录模块失败。
ModuleOption允许有多个参数。例如你可以设定调试参数为True(debug=true),这样诊断输出将被送到System.out中。
4.单点登录系统中认证功能的设计和实现
目前已经出现了众多的商用SSO产品,但一般都价格昂贵,或者局限于特定的平台,例如:Microsoft的.net Passport、IBM WebSphere Portal Server、Netegrity SiteMinder等,由于J2EE没有定义SSO的具体实现方法,他们的实现机制不尽一样;尽管如此,但这些产品的实现机制都遵循一种通用的模式,这种模式由三个主要部分组成:入口检查单元(Gatekeeper)、身份认证单元(Authenticator)、用户凭征存储单元(User Credential Store),我们称在这三个部分基础上的SSO为GAC-SSO[6](GateKeeper,Authenticator and Credential Store SSO),这三个组成部分之间的交互关系描述如下:
1.当Gatekeeper检查到用户请求一个受保护的资源时,它首先检查该用户是否已经为该Web应用创建好一个Login Session,若没有,Gatekeeper再检查是否已经建立一个和Authenticator相关的全局SSO session;
2.若没有建立全局的SSO Session,用户被导向到Authenticator的登录页面,并要求用户提供用户名和密码等凭证信息;
3.Authenticator接受用户提供的凭证信息,然后通过用户的身份认证系统验证用户;
4.若Authenticator验证成功,建一个全局Login Session,导向至Gatekeeper,并在该用户的Web应用中为其创建一个Login Session;
5.Authenticator和Gatekeepers之间通过多种方式进行交互,例如:共享cookie方式、Web Service的SOAP或者利用安全声明标记语言(SAML)来进行信息的安全交换。
在GAC-SSO中采用JAAS的认证机制,使得认证变得简单可行。由于JAAS支持插拔的认证机制,可以根据需求进行定制不同的LoginModule,仅对配置文件进行适当的修改,而代码几乎可以不作修改,如我们采用基于Kerberos协议的认证机制,SUN已默认实现其LoginModule即Krb2LoginModule,就无需再编码实现该Module,极大的节省了工作量。
同时,从图1可以看出,在LoginModule之间共享用户验证信息是利用JAAS实现单点登录的基础和关键,在此我们采用JAAS实现。首先把各种认证机制按需放入配置文件的登录模块列表中。在LoginModule接口的initialize(Subject subject,CallbackHandler callbackhandler,Map sharedState,Map options)方法中,Map类型的sharedState参数可用于登录模块之间的数据共享,因此可用于共享各验证过程的登录状态。
在LoginContext类的login()方法中定义Map类型的成员变量sharedStateMap,在执行LoginModule的initialize()方法时会将该对象传递给登录模块。Map对象可保存两个对象之间的映射关系,因此GateKeeper中只要执行Map类型的sharedStateMap对象的put(userName,loginFlag)方法,即可将需要传递的信息loginFlag与userName关联,来判断userName是否登录(其中每个用户的userName在整个的GAC-SSO中必须唯一)。其他登录模块只要使用sharedStateMap对象的get(userName)方法即可获取该userName的登录状态,扩展开来也可以实现其他共享信息的传递,但若系统的权限控制较复杂,共享信息较多的话,可以在User Credential Store模块中,利用Principal对象贮存用户的身份等共享信息,通过Principal对象进行传递。据此我们可以开发出符合要求的单点登录系统。
5 结束语
GAC-SSO模式比较适合中小企业,尤其是那些需要建立自己的SSO系统,但又没有很多初始投资的企业;基于这一模式,企业不需要依赖特定的SSO产品,就可以建立拥有自有技术的单点登录解决方案。文中介绍了单点登录的概念和JAAS框架的构成,最后提出了利用JAAS实现单点登录的用户验证功能。
参考文献
[1]. The Open Group's "Introduction to Single Sign-On"[EB/OL], http://www.opengroup.org/security/sso/sso_intro.htm 
[2] Mayank Upadhyay and Ram Marti, Single Sign-On Using Kerberos in Java, [EB/OL] http://java.sun.com/j2se/1.4.2/docs/guide/security/jgss/single-signon.html, May 2 2001
[3] John Kohl and B. Clifford Neuman,The Kerberos Network Authentication Service (Version 5). Internet Request for Comments RFC-1510, September 1993
[4] JAAS Overview[EB/OL], http://java.sun.com/products/jaas/overview.html, 2002
[5]林天峰,基于JAAS的Java安全编程[J], 计算机应用与软件,2003年7月,P86-88
[6] Jian Zhong and Mike Lehr, US Department of Energy signs on to J2EE [EB/OL] http://www.javaworld.com/javaworld/jw-05-2002/jw-0524-signon-p2.html, May 24, 2002

 

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。