JAAS:灵活的Java安全机制(2)

转载 2004年07月18日 21:13:00
客户端和服务器端的JAAS

  开发人员可以将JAAS应用到客户端和服务器端。在客户端使用JAAS很简单。在服务器端使用JAAS时情况要复杂一些。目前在应用服务器市场中的JAAS产品还不是很一致,使用JAAS的J2EE应用服务器有一些细微的差别。例如JBossSx使用自己的结构,将JAAS集成到了一个更大的安全框架中;而虽然WebLogic 6.x也使用了JAAS,安全框架却完全不一样。

  现在你能够理解为什么我们需要从客户端和服务器端的角度来看JAAS了。我们将在后面列出两种情况下的例子。为了使服务器端的例子程序更加简单,我们使用了Resin应用服务器。

  核心JAAS类

  在使用JAAS之前,你首先需要安装JAAS。在J2SE 1.4中已经包括了JAAS,但是在J2SE 1.3中没有。如果你希望使用J2SE 1.3,你可以从SUN的官方站点上下载JAAS。当正确安装了JAAS后,你会在安装目录的lib目录下找到jaas.jar。你需要将该路径加入Classpath中。(注:如果你安装了应用服务器,其中就已经包括了JAAS,请阅读应用服务器的帮助文档以获得更详细的信息)。在Java安全属性文件java.security中,你可以改变一些与JAAS相关的系统属性。该文件保存在<jre_home>/lib/security目录中。

  在应用程序中使用JAAS验证通常会涉及到以下几个步骤:

  1. 创建一个LoginContext的实例。

  2. 为了能够获得和处理验证信息,将一个CallBackHandler对象作为参数传送给LoginContext。

  3. 通过调用LoginContext的login()方法来进行验证。

  4. 通过使用login()方法返回的Subject对象实现一些特殊的功能(假设登录成功)。

  下面是一个简单的例子:

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包中。

  普通类型:Subject,Principal,凭证

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

   身份(Identities):由一个或多个Principal对象表示

   公共凭证(Public credentials):例如名称或公共秘钥

   私有凭证(Private credentials):例如口令或私有密钥

  Principal对象代表了Subject对象的身份。它们实现了java.security.Principal和java.io.Serializable接口。在Subject类中,最重要的方法是getName()。该方法返回一个身份名称。在Subject对象中包含了多个Principal对象,因此它可以拥有多个名称。由于登录名称、身份证号和Email地址都可以作为用户的身份标识,可见拥有多个身份名称的情况在实际应用中是非常普遍的情况。

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

  验证:LoginContext

  在应用程序层中,你可以使用LoginContext对象来验证Subject对象。LoginContext对象同时体现了JAAS的动态可插入性(Dynamic Pluggability),因为当你创建一个LoginContext的实例时,你需要指定一个配置。LoginContext通常从一个文本文件中加载配置信息,这些配置信息告诉LoginContext对象在登录时使用哪一个LoginModule对象。

  下面列出了在LoginContext中经常使用的三个方法:

  login () 进行登录操作。该方法激活了配置中制定的所有LoginModule对象。如果成功,它将创建一个经过了验证的Subject对象;否则抛出LoginException异常。

  getSubject () 返回经过验证的Subject对象

  logout () 注销Subject对象,删除与之相关的Principal对象和凭证

  验证:LoginModule

  LoginModule是调用特定验证机制的接口。J2EE 1.4中包含了下面几种LoginModule的实现类:

  JndiLoginModule 用于验证在JNDI中配置的目录服务

  Krb5LoginModule 使用Kerberos协议进行验证

  NTLoginModul 使用当前用户在NT中的用户信息进行验证

  UnixLoginModule 使用当前用户在Unix中的用户信息进行验证

  同上面这些模块绑定在一起的还有对应的Principal接口的实现类,例如NTDomainPrincipal和UnixPrincipal。这些类在com.sun.security.auth包中。

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

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

  login () 进行验证

  commit () 当LgoninContext对象接受所有LoginModule对象传回的结果后将调用该方法。该方法将Principal对象和凭证赋给Subject对象。
  
  abort () 当任何一个LoginModule对象验证失败时都会调用该方法。此时没有任何Principal对象或凭证关联到Subject对象上。

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

  在应用程序的代码中,程序员通常不会直接调用上面列出的方法,而是通过LigonContext间接调用这些方法。

  验证:CallbackHandler和Callback

  CallbackHandler和Callback对象可以使LoginModule对象从系统和用户那里收集必要的验证信息,同时独立于实际的收集信息时发生的交互过程。
  
  JAAS在javax.sevurity.auth.callback包中包含了七个Callback的实现类和两个CallbackHandler的实现类:ChoiceCallback、ConfirmationCallback、LogcaleCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback、DialogCallbackHandler和TextCallBackHandler。Callback接口只会在客户端会被使用到。我将在后面介绍如何编写你自己的CallbackHandler类。

JAAS:灵活的Java安全机制

  Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Java早期的...
  • oicqren
  • oicqren
  • 2004年11月24日 18:38
  • 1060

ActiveMQ(三):ActiveMQ的安全机制、api及订阅模式demo

一、ActiveMQ安全机制ActiveMQ是使用jetty部署的,修改密码需要到相应的配置文件 配置文件是这个:在其第123行添加用户名和密码,添加配置如下: ...
  • milsevol
  • milsevol
  • 2017年05月23日 15:59
  • 423

JAAS:灵活的Java安全机制(1)

 摘要:  Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可伸缩的机制来保证客户端或服务器端的Java程序。Jav...
  • JasonSeaver
  • JasonSeaver
  • 2004年07月18日 21:11
  • 1332

JAAS:灵活的Java安全机制(3)

 配置文件  上面我已经提到,JAAS的可扩展性来源于它能够进行动态配置,而配置信息通常是保存在文本。这些文本文件有很多个配置块构成,我们通常把这些配置块称作申请(Application)。每个申请对...
  • JasonSeaver
  • JasonSeaver
  • 2004年07月18日 21:14
  • 1148

JAAS:灵活的Java安全机制(4)

使用JSP和关系数据库进行登录验证  现在我们希望将通过命令行调用的程序一直到Web应用程序中。由于Web应用程序与一般的应用程序的交互方式有区别不同,我们将不能使用JAAS提供的标准Callback...
  • JasonSeaver
  • JasonSeaver
  • 2004年07月18日 21:14
  • 1252

JAAS:灵活的Java安全机制(入门级中文)

原文地址: http://www.javaworld.com/javaworld/jw-09-2002/jw-0913-jaas.htmlJAAS:灵活的Java安全机制        摘要:  Ja...
  • jwbecalm
  • jwbecalm
  • 2005年11月21日 23:19
  • 2220

什么是JAAS,以及灵活的Java安全机制

今天在论坛上看到JASS,不清楚是什么呢,网上找了一下,受益良多 Java Authentication Authorization Service(JAAS,Java验证和授权API)提供了灵活和可...
  • yinyuan1987
  • yinyuan1987
  • 2009年04月09日 21:32
  • 16263

Jaas原理及实现

JAAS是对JCE安全框架的重要补充,通过提供认证用户和确定用户授权来增强JAVA解决方案的动态安全性,使得资源能够得到很好得到保护和控制(JAAS使用动态的安全策略来定义权限,而不是将其静态的嵌入到...
  • Jesse621
  • Jesse621
  • 2015年01月30日 11:54
  • 2639

JAVA安全机制

1,java.policy设置文件访问权限:java.io.FilePermissioneg: grant codeBase "http://www.pepress.com.cn/-" {      ...
  • mingde_he
  • mingde_he
  • 2010年08月23日 23:31
  • 6193

java安全 ——JAAS(Java 认证和授权服务)开发指南

以下内容转自: http://lyb520320.iteye.com/blog/720478 【0】README 1)本文翻译自:http://java.sun.com/developer/tec...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016年02月21日 18:53
  • 1720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAAS:灵活的Java安全机制(2)
举报原因:
原因补充:

(最多只允许输入30个字)