首页 > 范文大全 > 正文

利用JAAS实现鉴别

开篇:润墨网以专业的文秘视角,为您筛选了一篇利用JAAS实现鉴别范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要: JAAS作为java安全框架的一部分,提供了灵活和可伸缩的机制使鉴别模块能以一种通用的、可配置、可插拔的方式对java程序进行鉴别;同时给出了一种基于JAAS框架的鉴别模块的实现。

Abstract: As a part of security framework, JAAS provides flexible and scalable mechanism to authenticate java programs. In this paper, we also provide an implementation of authentication based on JAAS.

关键词: JAAS;鉴别;票据;服务提供者接口

Key words: JAAS;authentication;ticket;sevice provider interface

中图分类号:TP39文献标识码:A文章编号:1006-4311(2010)28-0162-02

0引言

随着计算机在信息处理中的普遍使用,显然需要自动化的工具保护存储在计算机中的文件和其它信息,安全性作为对资源进行保护和验证的机制,也随着计算机的发展显得愈来愈重要。有很多种安全模型可以用来对数据提供不同程度和方向的保护,这些安全模型使用加密、访问控制、鉴别或其他安全方法对资源进行保护。鉴别就是通过对一个实体的身份进行判别的过程,鉴别往往与授权结合起来使用,只有经过鉴别后的用户才能给予授权,因为在向用户开放保护资源的访问权限之前,必须对用户的身份进行确认。Sun公司提供的JAAS(Java Authentication Authorization Service)就提供了灵活和可伸缩的机制来使鉴别模块可以以一种通用的、可配置、可插拔的方式来对java程序进行鉴别[1,2]。

1基于JAAS的鉴别应用框架

JAAS的鉴别应用框架如图1所示,它通过在应用程序和底层的验证和授权机制之间加入一个抽象层,使抽象层能独立于平台,在底层的验证和授权机制,只是提供了一个接口:服务提供者接口(Service Provider Interface,SPI)来给鉴别模块进行调用。这样,应用程序级的代码只要处理LoginContext。由LoginContext调用下面一组实现服务提供者接口的动态配置的LoginModules模块,再由LoginModule模块来调用底层的验证和授权机制进行鉴别。

JAAS提供了一些LoginModule的参考实现代码,比如JndiLoginModule、NTLoginModule。开发人员也可以自己实现LoginModule,但必须实现底层的服务提供者接口(Service Provider Interface,SPI),我们的鉴别模块即是如此。

2JAAS应用框架牵涉到的几个对象

在JAAS框架中,牵涉到一些对象[3]:

CallbackHandler和Callback对象可以使LoginModule对象从系统和用户那里收集必要的验证信息,它在用户端收集用户信息,同时又独立于实际的收集信息过程,以一种系统内部加密的方式传到鉴别模块处。

Principal对象代表了鉴别对象的身份。每个鉴别对象大多都有若干个身份,如用户名、身份证号和Email地址都可以作为用户的身份标识,所以拥有多个身份名称的情况在实际应用中是非常普遍的。

Subject类代表了一个验证实体,它可以是用户、管理员、Web服务、设备或者其他的过程。该类包含三中类型的安全信息。

身份(Identities):由一个或多个Principal对象表示;公共凭证(Public credentials):例如名称或公共秘钥;私有凭证(Private credentials):例如口令或私有密钥。

凭证对象并不是一个特定的类或接口,它可以是任何对象。凭证中可以包含任何特定安全系统需要的验证信息,例如标签(ticket)、密钥或口令。Subject对象中维护着一组特定的私有和公有的凭证,这些凭证可以通过getPrivateCredentials( )和getPublicCredentials( )方法获得。这些方法通常在应用程序层中的安全子系统中被调用。

3利用jaas的鉴别过程

在应用程序中使用JAAS鉴别涉及到以下几个步骤[4,5,6]:①创建一个LoginContext的实例。②为了能够获得和处理验证信息,将一个CallBackHandler对象作为参数传送给LoginContext。③通过调用LoginContext的login( )方法来进行验证。④通过使用login( )方法返回Subject对象实现一些特殊的功能(假设登录成功)。

程序代码如下:

LoginContext lc = null;

try {

lc = new LoginContext("Sample", new MyCallbackHandler());

} catch (LoginException le) {

System.err.println("Cannot create LoginContext. "

+ le.getMessage());

System.exit(-1);

} catch (SecurityException se) {

System.err.println("Cannot create LoginContext. "

+ se.getMessage());

System.exit(-1);

}

Subject sub = lc.getSubject();

Subject.doAs(sub, new MyPrivilegedAction());

在运行这段代码时,后台进行了以下的工作。

①当初始化时,LoginContext对象首先在JAAS配置文件中找到Sample文件,然后根据配置文件的内容决定该加载哪个LoginModule对象。在这里LoginContext对象调用的就是我们要实现的鉴别模块SampleLoginModule。②在登录时,LoginContext对象调用SampleLoginModule对象的login( )方法。③login( )方法进行验证操作或获得一个CallbackHandle对象。④CallbackHandle对象通过使用一个或多个CallBack方法同用户进行交互,获得用户输入。⑤向一个新的Subject对象中填入验证信息,然后执行授权操作。

4实现鉴别模块

要实现鉴别模块,必须实现底层的服务提供者接口(Service Provider Interface,SPI),SPI接口提供了五个方法:initialize ( )、login ( )、commit ( )、abort ( )、logout ( ),我们的鉴别模块都必须对其进行实现。

LoginModule接口中包含了五个方法:

initialize( ):当创建一LoginModule实例时会被构造函数调用。

login ( ):进行验证。

commit( ): 当LgoninContext对象接受所有LoginModule对象传回的结果后将调用该方法。该方法将Principal对象和凭证赋给Subject对象。

abort( ):当任何一个LoginModule对象验证失败时都会调用该方法。此时没有任何Principal对象或凭证关联到Subject对象上。

logout( ):删除与Subject对象关联的Principal对象和凭证。

我们主要介绍login( )方法

Login( )方法进行了下面的操作:①创建两个Callback对象。一个NameCallback对象,一个PasswordCallback对象,PasswordCallback对象用来取用户的密码,NameCallback对象用来传递用户的注册名。②通过将callbacks作为参数传递给CallbackHandler的handle( )方法来激活Callback。③通过Callback对象获得用户名/密码。④在Validate( )方法中验证获取的用户名/密码。

下面是SampleLoginModule中的login( )方法的代码。

public boolean login() throws LoginException {

if (callbackHandler == null)

throw new LoginException("no handler");

NameCallback nameCb = new NameCallback("user: ");

PasswordCallback passCb = new PasswordCallback("password: ", true);

callbacks = new Callback[] { nameCb, passCb };

MyCallbackHandler.handle(callbacks);

String username = nameCb.getName();

String password = new String(passCb.getPassword());

success = rdbmsValidate(username, password);

return(true);

}

在MyCallbackHandler类的handle( )方法中我们利用Callback对象同用户进行交互。

5结语

通过JAAS提供动态的、可插拔的模型来进行对用户鉴别,从而使应用程序的鉴别机制更加方便、灵活,我们在工程实践中就应用了这种技术,使用表明,这种鉴别方式也非常适合工程实践。

参考文献:

[1]徐迎晓.Java安全性编程实例.北京:清华大学出版社,2003.

[2]Sun Microsystem. Java Authentication and Authorization Service. /products/jaas.

[3]Rich Helton,Johennie Helton.Java安全解决方案(袁泉,吴静等译). 北京:清华大学出版社,2003.

[4]Sun Microsystem. J2EE Overview [M]; /j2ee/.

[5]Dacheng Zhang,Xu Jie,Xian xian Li.Dynamic Cross-Realm Authentication for Multi-Party Service Interactions. 37th Annual IEEE/IFIP International Conference on Dependable Systems and Networks(DSN'07) 0-7695-2855-4/07.

[6]Haruki Ota, Shinsaku Kiyomoto, Toshiaki Tanaka. Security for Authentication and Key Exchange Protocol. International Journal of Computer Science and Network Security, VOL.9 No.3, March 2009.