SUN的J2EE框架中的JAAS (Java Authentication Authorization Service)提供了灵活和可伸缩的机制来保证客户端或服务器端的安全。JAAS强调的是通过验证谁在运行代码以及它的权限来保护系统免受攻击。它最伟大的地方是能让你能够将一些标准的安全机制,例如:Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议)等安全服务便捷的集成到系统中(SUN已经提供了这些标准安全机制的实现类)。当然我们也可以将我们已有的安全系统集成到JAAS中去,所需要的工作仅仅是一个安全接口的封装和配置工作。
在以下的篇幅中,我们将重点说明一下JAAS中的安全框架的三个应用
u一个基于标准NT模式认证的应用,
u基于自定义安全模式的应用
uJAAS在Web上的应用
[JAAS整体框架]
在应用程序中使用JAAS验证的步骤:
-
创建一个LoginContext的实例。(传递两个参数:验证模式和CallBackHandler)
-
通过调用LoginContext的login()方法来进行验证。
-
应用login()方法返回的Subject对象中的信息完成权限控制
下面是一个简单的例子:
让我们先看代码中涉及到的核心JAAS类和接口。这些类可以被分为三种类型:
u
u
u
上面列举的类和接口大多数都在javax.security.auth包中。在J2SE1.4中,还有一些接口的实现类在com.sun.security.auth包中。
应用JAAS框架
配置部分
上面已经提到,JAAS的可扩展性来源于它能够进行动态配置,而配置信息通常是保存在文本。这些文本文件有很多个配置块构成,我们通常把这些配置块称作申请(Application)。每个申请对应了一个或多个特定的LoginModule对象.
当你的代码构造一个LoginContext对象时,你需要把配置文件中申请的名称传递给它。LoginContext将会根据申请中的信息决定激活哪些LoginModule对象,按照什么顺序激活以及使用什么规则激活。
配置文件的结构如下所示:
Application ModuleClass ... |
下面是一个名称为Sample的申请
Sample com.sun.security.auth.module.NTLoginModule |
上面这个简单的申请指定了LoginContext对象应该使用NTLoginModule进行验证。类的名称在ModuleClass中被指定。Flag控制当申请中包含了多个LoginModule时进行登录时的行为:Required、Sufficient、Requisite和Optional。最常用的是Required,使用它意味着对应的LoginModule对象必须被调用,并且必须需要通过所有的验证。
DEMO1:集成应用NT安全服务
步骤一 编辑配置文件
其中NTLoginModule是SUN提供的NT验证的实现类,我们只要将其配置进来即可
步骤二 应用JAAS接口
DEMO2集成非标准的安全服务
JAAS也能将非标准的安全服务集成进来,对于非标准的安全服务的集成,我们需要做的工作是用以有的安全接口来实现JAAS的
步骤一 实现SampleLoginModule
实现LoginModule
u
u
u
u
步骤二 实现CallBackHandler
实现CallbackHandler接口,实现
public
步骤三 在JAAS中集成
类似DEMO1的NT安全服务的集成
DEMO3 在Web上应用JAAS框架
现在我们希望将通过命令行调用的程序一直到Web应用程序中。由于Web应用程序与一般的应用程序的交互方式有区别不同,我们将不能使用JAAS提供的标准Callback和CallbackHandler类。因为我们不能在Web程序中打开一个命令窗口让用户输入信息。在这种情况下我们可以在创建LoginContext对象前先初始化一个Subject对象,在Subject对象的凭证中保存用户名和密码。然后我们可以将该Subject对象传递给LoginContext的构造函数。
String |