JAAS介绍
1、JAAS是什么?
JAAS---Java Authentication Authorization Service(JAAS,Java验证和授权服务)。
2、JAAS背景
从早期所谓的 Java 沙箱到 JDK 1.4 引入的健壮的、全功能的安全体系结构,安全性一直是 Java 平台的基本组件。从那时到现在,Java 语言的设计者收到了来自团体的大量关于安全的 Java 应用程序(或者企业环境)可以做什么和不做什么的意见,他们自己也添加了若干技巧。
可以说随着 J2EE Web 应用程序安全体系结构的引入,我们不断从近 10 年的反复试验有所收获,事实也表明了这一点。J2EE 安全框架由三个 API 组成:Java 认证和授权服务(JAAS)、Java 安全套接字扩展(JSSE)和 Java 加密扩展(Java Cryptography Extension,JCE)。虽然 JCE 是一个有意思和重要的 API,但是它与我们所关注的安全 Web 应用程序开发的“三大项”――认证、授权和传输――并不特别相关。所以在本月的专栏中我们将集中讲述 JAAS 和 JSSE。
- Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。
- JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统面受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统中。
3、JAAS目标
JAAS 提供了一种灵活的、说明性的机制,用于对用户进行认证并验证他们访问安全资源的能力。JSSE 定义了通过安全套接字层(SSL)进行安全 Web 通信的一种全 Java 的机制。通过结合这两种技术,可以使我们的应用程序:
- 验证用户就是他或者她所宣称的那个人(认证)。
- 保证允许他或者她访问所要求的资源(授权)。
- 通过安全网络连接进行完整的信息交换(传输)。
现在,我们来看每一个基础的功能组件。
4、JAAS的核心类
- 公用类
Subject,Principal,Credential
- 验证类和接口
LoginContext,LoginModule,CallbackHandler,Callback
- 授权类
Policy,AuthPermission,PrivateCredentialPermission
javax.security.auth.Subject是核心类,它表示和一个实体(例如一个人)有关一系列的相关信息,包含此实体的Principal,公开Credential以及私有Credential。
Subject
要授权访问资源,应用必须首先验证请求的来源。JAAS框架使用单词subject来表示请求的来源。Subject类代表了一个验证实体,它可以是用户、管理员、Web服务,设备或者其他的过程。该类包含了三中类型的安全信息:
- 身份(Identities):由一个或多个Principal对象表示。
- 公共凭证(Public credentials):例如名称或公共秘钥。
- 私有凭证(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()方法获得。这些方法通常在应用程序层中的安全子系统被调用。
5、例子
LoginContext lc
= new LoginContext("MyExample");
try {
lc.login();
} catch (LoginException) {
//Authentication failed.
}
//Authentication successful, we can now continue.
//We can use the returned Subject if we like.
Subject sub = lc.getSubject();
Subject.doAs(sub, new MyPrivilegedAction());
在运行这段代码时,后台进行了以下的工作。
1. 当初始化时,LoginContext对象首先在JAAS配置文件中找到MyExample项,然后更具该项的内容决定该加载哪个LoginModule对象(参见图二)。
2. 在登录时,LoginContext对象调用每个LoginModule对象的login()方法。
3. 每个login()方法进行验证操作或获得一个CallbackHandle对象。
4. CallbackHandle对象通过使用一个或多个CallBack方法同用户进行交互,获得用户输入。
5. 向一个新的Subject对象中填入验证信息。
我们将对代码作进一步的解释。但是在这之前,让我们先看代码中涉及到的核心JAAS类和接口。这些类可以被分为三种类型:
普通类型 Subject,Principal,凭证
验证 LoginContext,LoginModule,CallBackHandler,Callback
授权 Policy,AuthPermission,PrivateCredentialPermission
上面列举的类和接口大多数都在javax.security.auth包中。在J2SE 1.4中,还有一些接口的实现类在com.sun.security.auth包中。
6、总结
JAAS的优点:
-
Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的安全框架强调的是通过验证代码的来源和作者,保护用户避免受到下载下来的代码的攻击。JAAS强调的是通过验证谁在运行代码以及他/她的权限来保护系统免受用户的攻击。它让你能够将一些标准的安全机制,例如Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议),Kerberos等通过一种通用的,可配置的方式集成到系统中。
-
传统的软件在实现身份认证功能过程中,往往自行开发专用的认证模块。由于不同的软件开发人员在信息安全方面水平参差不齐,实现的认证模块安全性往往得不到保证。认证和授权应当同业务逻缉分离一个通用的身份认证模块不仅能减轻软件开发人员的负担,更能保证认证的强度,确保在当认证方式发生改变时,应用程序不受影响。
-
可以基于JAAS建立拥有自有技术的单点登录解决方案。
Java 平台以其岩石般坚固的安全性闻名。每一年 Java 安全性框架都会变得更灵活和更健壮,JAAS 和 JSSE 的加入表明这个传统将会继续发扬光大。
参考链接: