JAAS基础认证和授权机制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
安全性是所有可以用来对资源进行保护和验证的机制。有很多种安全模型都可以用来对数据提供保护。这些安全模型可以使用加密、访问控制或其他安全方法。授权(Authorization),或称为访问控制,可以使用不同的安全服务来对资源进行保护:一种方法是Java认证和授权服务(Java Authentication and Authorization Service,JAAS),另外一种方法是Windows 2000的活动目录(Active Directory)。本文着重于介绍JAAS安全服务。
认证和授权是两种最基本的安全机制。认证就是简单地对一个实体的身份进行判断;而授权则是向实体授予对数据资源和信息访问权限的决策过程。JDK 1.4已经集成了一项提供认证和授权功能的标准服务,该服务就称为Java认证和授权服务。
JAAS通过一个配置文件来定义认证机制,而根本不需要使用任何代码。认证机制之所以需要参数是为了确定用户的身份(对用户进行标识)。用来对用户进行认证的参数,例如每种认证机制中使用的用户名和口令,都称为验证信息。Subject表示我是的那个人,但是我们也可以使用验证信息(可以理解为驾驶执照)向巡警证明自己的身份,并使用另外一个验证信息(可以理解为护照)向边防警察证明自己的身份。授权只能在认证之后进行,因为在向用户开放保护资源的访问权限之前,必须对用户的身份进行确认。JAAS框架对由配置文件指定的认证模块进行了包装。如果认证成功,就会返回一个包含验证信息的Subject,认证机制所返回的这个验证信息会用于授权过程。
JAAS首先使用一个LoginContext类来查找配置文件中的内容,这些内容可以用来对LoginModules 进行初始化(见图1)。所有LoginContext没有指定的初始化参数都会包含在配置文件中。LoginContext还会向LoginModule传递一个CallbackHandler,CallbackHandler又会回调适当的应用程序,从而获得其他认证信息。例如,如果LoginContext在创建CallbackHandler时没有指定用户名和口令,而LoginModule又的确需要这些内容,那么LoginModule就会使用CallbackHandler 来回调LoginContext,以重新获得所需要的信息。
为了让验证信息可用于登录,LoginContext还可以向LoginModule传递Subject。
图1 JAAS初始化序列图
在创建LoginContext时,完成LoginModule的初始化之后,LoginContext就可以调用login( )方法(见图2),它会对Subject进行认证。登录过程需要经过一个由LoginModule组成的菊花链,根据配置文件的内容,每一步都需要一个不同类型的验证信息。配置文件还可以指定可选而非必须的LoginModule的配置。LoginModule会完成一个两阶段的登录过程:第一个阶段是登录过程调用LoginModule的login( )方法;第二个阶段是调用commit( )或abort( )方法完成登录过程。commit( )过程是当所有其他LoginModule完成自己的login( )方法之后才在登录过程中被调用的,然后最后一个LoginModule会调用commit方法,之后是下一个,依此类推。如果login( )方法不能成功执行,就会调用abort方法来清除已经执行的操作。如果所有必须的commit( )方法都成功完成了,那么登录过程也就成功地完成了。
图2 JAAS登录序列图
授权过程需要使用在登录过程中确定的验证信息,因此,认证过程通常都是在Subject类中实现的,这并没有什么可奇怪的。Subject类会使用PrivilegedAction类来执行授权的过程。另外,还有一个扩展的PrivilegedAction类对要进行访问控制的资源进行了包装。不管验证信息是否有权对资源进行访问,这都是在安全策略文件中定义的。Java安全管理程序会首先读取适当的安全策略文件,并对权限和验证信息进行分析。然后,安全管理程序会根据这些权限和验证信息使用PrivilegedAction类对资源进行授权(或禁止访问)。如果该资源不允许一个特定的验证信息访问,就会触发一个访问异常。
在WebLogic中使用JAAS
WebLogic Application Server(WLS)7.0并没有对JAAS进行任何修改,JAAS依然是一个独立的扩充框架。WLS 7.0包含了自己的认证和授权机制,它并不需要策略文件。配置文件会对WLS LoginModule进行定义,使其用来包装WLS的认证机制。WLS LoginModule通常需要一个用户名、
一个口令以及一个指向适当WLS服务器的URL。WLS 7.0还包含了一种授权机制,可以对映射资源和角色进行授权。由于WLS 7.0在WebLogic的安全框架中实现了一种授权机制,因此策略文件和Java安全管理程序都不需要定义。在调用PrivilegedAction类时,需要使用
weblogic.security.Security类。
WebLogic 7.0给出了一个例子来展示如何执行基于JAAS的认证和授权,该例是在一个Java客户端应用程序中调用EJB来使用JAAS授权开放对资源的访问限制。这个例子对下面Sun的例子稍微进行了修改:
/j2se/1.4/docs/guide/security/jaas/JAASRefGuide.html#Sample.
这个例子包括一个JAAS配置文件,该文件指定了以下内容:EJB客户端用来执行认证的LoginModule的类名;用来搜集客户端证书和认证服务器的URL的CallbackHandler;一个PrivilegedAction类,该类包含了执行EJB访问操作的代码;以及一个客户端应用程序,该程序会创建一个LoginContext,调用login( )方法,并通过weblogic.security.Security.runAs方法来调用PrivilegedAction类。这个例子的流程如图3所示。你可以查看
/weblogic700/samples/server/src/examples/security/jaas文件来参考完整的例子。本文后面的内容会参考这个例子,从远程客户端的角度来讨论WLS中基于JAAS的认证和授权,并将其与服务器端的组件(例如servlet)进行比较。
图3 WLS 7.0的认证机制