JAAS

来源:互联网 发布:指针变量二维数组 编辑:程序博客网 时间:2024/04/30 03:31

SUN的J2EE框架中的JAAS (Java Authentication Authorization Service)提供了灵活和可伸缩的机制来保证客户端或服务器端的安全。JAAS强调的是通过验证谁在运行代码以及它的权限来保护系统免受攻击。它最伟大的地方是能让你能够将一些标准的安全机制,例如:Solaris NIS(网络信息服务)、Windows NT、LDAP(轻量目录存取协议)等安全服务便捷的集成到系统中(SUN已经提供了这些标准安全机制的实现类)。当然我们也可以将我们已有的安全系统集成到JAAS中去,所需要的工作仅仅是一个安全接口的封装和配置工作。

在以下的篇幅中,我们将重点说明一下JAAS中的安全框架的三个应用

u一个基于标准NT模式认证的应用,

u基于自定义安全模式的应用

uJAASWeb上的应用

安全专题-关于JAAS安全架构

[JAAS整体框架]


在应用程序中使用JAAS验证的步骤:

  1. 创建一个LoginContext的实例。(传递两个参数:验证模式和CallBackHandler) 
  2. 通过调用LoginContext的login()方法来进行验证。  
  3. 应用login()方法返回的Subject对象中的信息完成权限控制 

下面是一个简单的例子:

安全专题-关于JAAS安全架构

 

让我们先看代码中涉及到的核心JAAS类和接口。这些类可以被分为三种类型:  

普通类型SubjectPrincipal,凭证  

验证LoginContextLoginModuleCallBackHandlerCallback

授权PolicyAuthPermissionPrivateCredentialPermission

  上面列举的类和接口大多数都在javax.security.auth包中。在J2SE1.4中,还有一些接口的实现类在com.sun.security.auth包中。 

应用JAAS框架

安全专题-关于JAAS安全架构

 

配置部分

上面已经提到,JAAS的可扩展性来源于它能够进行动态配置,而配置信息通常是保存在文本。这些文本文件有很多个配置块构成,我们通常把这些配置块称作申请(Application)。每个申请对应了一个或多个特定的LoginModule对象.

  当你的代码构造一个LoginContext对象时,你需要把配置文件中申请的名称传递给它。LoginContext将会根据申请中的信息决定激活哪些LoginModule对象,按照什么顺序激活以及使用什么规则激活。

  配置文件的结构如下所示:

Application {

ModuleClass Flag ModuleOptions;

 ModuleClass Flag ModuleOptions;

... };

下面是一个名称为Sample的申请

Sample {

com.sun.security.auth.module.NTLoginModule Rquired debug=true;

 }

  上面这个简单的申请指定了LoginContext对象应该使用NTLoginModule进行验证。类的名称在ModuleClass中被指定。Flag控制当申请中包含了多个LoginModule时进行登录时的行为:RequiredSufficientRequisiteOptional。最常用的是Required,使用它意味着对应的LoginModule对象必须被调用,并且必须需要通过所有的验证。

DEMO1:集成应用NT安全服务

步骤一 编辑配置文件

安全专题-关于JAAS安全架构

其中NTLoginModuleSUN提供的NT验证的实现类,我们只要将其配置进来即可

步骤二 应用JAAS接口

安全专题-关于JAAS安全架构

DEMO2集成非标准的安全服务

JAAS也能将非标准的安全服务集成进来,对于非标准的安全服务的集成,我们需要做的工作是用以有的安全接口来实现JAAS的 LoginModule接口和CallBackHandler接口。

步骤一 实现SampleLoginModule

实现LoginModule 接口 ,实现4个方法

public boolean login() throws LoginException  中完成密码校验工作

public boolean commit() throws LoginException 返回用户权限,保存入Subject对象

public boolean abort() throws LoginException 中断用户的登陆

public boolean logout() throws LoginException 注销

步骤二 实现CallBackHandler

实现CallbackHandler接口,实现

public void handle(Callback[] callbacks) 主要是获得用户认证信息

步骤三 JAAS中集成

类似DEMO1NT安全服务的集成

DEMO3 Web上应用JAAS框架

现在我们希望将通过命令行调用的程序一直到Web应用程序中。由于Web应用程序与一般的应用程序的交互方式有区别不同,我们将不能使用JAAS提供的标准CallbackCallbackHandler类。因为我们不能在Web程序中打开一个命令窗口让用户输入信息。在这种情况下我们可以在创建LoginContext对象前先初始化一个Subject对象,在Subject对象的凭证中保存用户名和密码。然后我们可以将该Subject对象传递给LoginContext的构造函数。 

String user request.getParameter("user");
String pass request.

0 0
原创粉丝点击