作者:千年精灵(MSN:j2ee AT hotmail.com,QQ:800736),转载请著名出处。
(一) JAAS技术简介
JavaTM Authentication and Authorization Service (JAAS),自JDK1.4以来已经集成于JDK之中。
JAAS可以完成如下两个功能:
l 验证用户身份,可靠并且安全的确定当前是谁在执行Java代码,无论是作为应用程序执行还是作为一个applet、一个bean还是一个servlet;
l 为用户授权,确认他们拥有执行该操作的正确权限。
JAAS验证技术是可插拔的,这意味着系统允许多种验证手段共存。新的或者升级了的验证模块可以直接使用,而不需要去修改应用本身。系统通过实例化LoginContext对象来启用验证过程,LoginContext对象依次引用一个配置文件来决定使用哪(几)种验证技术或LoginModule。一个典型的LoginModule可能需要用户名和密码来进行验证,其他的也可能通过读取声音或指纹来进行验证。
JAAS的认证机制建立于一整套可插拔的模块(参看下图)基础上。
JAAS的可插拔模块认证机制概览图
JAAS的核心类和接口:
l 公用类
n Subject,Principal,Credential
l 验证类和接口
n LoginContext,LoginModule,CallbackHandler,Callback
l 授权类
n Policy,AuthPermission,PrivateCredentialPermission
作者:千年精灵(MSN:j2ee AT hotmail.com,QQ:800736),转载请著名出处。
javax.security.auth.Subject是核心类,它表示和一个实体(例如一个人)有关一系列的相关信息,包含此实体的Principal,公开Credential以及私有Credential。
下面重点谈谈几个核心类。
Subject
要授权访问资源,应用必须首先验证请求的来源。JAAS框架使用单词subject来表示请求的来源。Subject类代表了一个验证实体,它可以是用户、管理员、Web服务,设备或者其他的过程。该类包含了三中类型的安全信息:
l 身份(Identities):由一个或多个Principal对象表示
l 公共凭证(Public credentials):例如名称或公共秘钥
l 私有凭证(Private credentials):例如口令或私有密钥
Principals
Principal对象代表了Subject对象的身份。它是一个惟一的实体,比如个人或者组的名字、帐号、社会安全号或者类似的惟一标识。为了惟一标识一个 subject(这是认证的关键部分),一个或者多个 principal 必须与这个 subject 相关联。
它们实现了java.security.Principal和java.io.Serializable接口。在Subject类中,最重要的方法是getName()。该方法返回一个身份名称。在Subject对象中包含了多个Principal对象,因此它可以拥有多个名称。由于登录名称、身份证号和Email地址都可以作为用户的身份标识,可见拥有多个身份名称的情况在实际应用中是非常普遍的情况。
Credential
在上面提到的凭证并不是一个特定的类或借口,一个 subject 可能拥有安全相关的属性,称为凭证(credential)。凭证可以是从简单的密码到复杂的加密密钥的任何东西。它可以是任何对象。凭证中可以包含任何特定安全系统需要的验证信息,例如标签(ticket),密钥或口令。Subject对象中维护着一组特定的私有和公有的凭证,这些凭证可以通过getPrivateCredentials()和getPublicCredentials()方法获得。这些方法通常在应用程序层中的安全子系统被调用。
下面是通过时序图表达的JAAS验证授权过程:
JAAS 建立在一种称为可插入的认证模块(Pluggable Authentication Module,PAM)的安全体系结构之上。PAM 的体系结构是 模块化的,这意味着它设计为可以通过交换模块,支持从一个安全协议组件无缝地转换到另一个协议组件。这个框架中定义良好的接口使得无需改变或者干扰任何现有的登录服务就可以加入多种认证技术和授权机制。PAM 体系结构可以集成范围广泛的认证技术,包括 RSA、DCE、Kerberos 以及 S/Key,因而 JAAS 也可以集成这些技术。此外,这个框架与基于智能卡的认证系统和 LDAP 认证兼容。
就像许多 Java 2 平台技术一样,JAAS API 定义了应用程序代码与将要执行业务逻辑的物理实现之间干净的抽象。这个抽象层不用重新编译现有的应用程序代码就可以作为登录模块的运行时替代。特别是,应用程序写到 LoginContext API,而认证技术提供程序则写到 LoginModule 接口。在运行时, LoginContext 将读取配置文件以确定应使用哪一个(一些)登录模块对访问特定应用程序的用户进行认证。
JAAS 所使用的认证方案以两种非常重要的实体为基础:principal 和 subject。实际被认证的人或者服务称为 subject。 principal是一个惟一的实体,比如个人或者组的名字、帐号、社会安全号或者类似的惟一标识。为了惟一标识一个 subject(这是认证的关键部分),一个或者多个 principal 必须与这个 subject 相关联。最后,一个 subject 可能拥有安全相关的属性,称为 凭证(credential)。凭证可以是从简单的密码到复杂的加密密钥的任何东西。
应用程序通过实例化一个 LoginContext 对象开始认证过程。 LoginContext 查询一个配置文件以确定进行认证所使用的一种(或者多种)认证技术以及相应的一个(或者多个) LoginModule 。一个非常简单的 LoginModule 可能会提示输入用户名和密码并对它们进行验证。高级一点的可能会使用现有的操作系统登录身份进行身份验证。理论上,甚至可以将一个 JAAS LoginModule 构建成与指纹识别器或者虹膜扫描仪交互。
(二) JAAS的优点
l Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统免受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统中。
l 传统的软件在实现身份认证功能过程中,往往自行开发专用的认证模块。由于不同的软件开发人员在信息安全方面水平参差不齐,实现的认证模块安全性往往得不到保证。认证和授权应当同业务逻缉分离一个通用的身份认证模块不仅能减轻软件开发人员的负担,更能保证认证的强度,确保在当认证方式发生改变时,应用程序不受影响。
l 可以基于JAAS建立拥有自有技术的单点登录解决方案。