
2022年JAAS灵活Java安全机制.docx
9页精品学习资源摘要:Java Authentication Authorization Service (JAAS,Java 验证和授权 API)供应了灵敏和可伸缩地机制来保证客户端或服务器端地 Java 程序.Java 早期地安全框架强调地是通过验证代码地来源和作者 , 爱惜用户防止受到下载下来地代码地攻击 .JAAS 强调地是通过验证谁在运行代码以及他/她地权限来爱惜系统面受用户地攻击 . 它让你能够将一些标准地安全机制 , 例如 Solaris NIS (网络信息服务)、 Windows NT、LDAP(轻量目录存取协议) ,Kerberos 等通过一种通用地 , 可配置地方式集成到系统中 . 本文第一向你介绍 JAAS验证中地一些核心部分 , 然后通过例子向你呈现如何开发登录模块 .你是否曾经需要为一个应用程序实现登录模块呢?假如你是一个比较有体会地程序员 , 信任你这样地工作做过许多次 , 而且每次都不完全一样 . 你有可能把你地登录模块建立在 Oracle 数据库地基础上 , 也有可能使用地是 NT 地用户验证 , 或者使用地是 LDAP目录. 假如有一种方法可以在不转变应用程序级地代码地基础上支持上面提到地全部这一些安全机制 , 对于程序员来说确定是一件幸运地事 .现在你可以使用 JAAS实现上面地目标 .JAAS 是一个比较新地地 Java API. 在 J2SE 1.3 中, 它是一个扩展包;在 J2SE 1.4 中变成了一个核心包 . 在本文中 , 我们将介绍 JAAS地一些核心概念 , 然后通过例子说明 如何将 JAAS应用到实际地程序中 . 本文地例子是依据我们一个基于 Web地 Java 应用程序进行改编地 , 在这个例子中 , 我们使用了关系数据库储存用户地登录信息 . 由于使用了 JAAS,我们实现了一个健壮而灵敏地登录和身份验证模块 . Java 验证和授权:概论在 JAAS显现以前 ,Java 地安全模型是为了中意跨平台地网络应用程序地需要而设计地 . 在 Java 早期版本中 ,Java 通常是作为远程代码被使用 , 例如 Applet,. 因此最初地安全模型把留意力放在通过验证代码地来源来爱惜用户上 . 早期地 Java 安全机制中包含地概念 , 如 SercurityManager, 沙箱概念 , 代码签名 , 策略文件 , 多是为了爱惜用户 .JAAS地显现反映了 Java 地演化 . 传统地服务器/客户端程序需要实现登录和存取把握 ,JAAS 通过对运行程序地用户地进行验证 , 从而达到爱惜系统地目地 . 虽然 JAAS同时具有验证和授权地才能 , 在这篇文章中 , 我们主要介绍验证功能 .通过在应用程序和底层地验证和授权机制之间加入一个抽象层 ,JAAS 可以简化涉及到 Java Security 包地程序开发 . 抽象层独立于平台地特性使开发人员可以使用各种不同地安全机制 , 而且不用修改应用程序级地代码 . 和其他 Java Security API 相像,JAAS 通过一个可扩展地框架:服务供应者接口( ServiceProvider Interface,SPI )来保证程序独立于安全机制 . 服务供应者接口是由一组抽象类和接口组成地 . 图一中给出了 JAAS程序地整体框架图 . 应用程序级地代码主要处理 LoginContext. 在 LoginContext 下面是一组动态配置地 LoginModules.LoginModule 使用正确地安全机制进行验证 .图一给出了 JAAS地概览 . 应用程序层地代码只需要和 LoginContext 打交道 . 在 LoginContext 之下是一组动态配置地 LoginModule 对象, 这些对象使用相关地安全基础结构进行验证操作 .图一 JAAS 概览JAAS供应了一些 LoginModule 地参考实现代码 , 比如 JndiLoginModule. 开发人员也可以自己实现LoginModule 接口, 就象在我们例子中地 RdbmsLonginModule. 同时我们仍会告知你如何使用一个简洁地配置文件来安装应用程序 .欢迎下载精品学习资源为了中意可插接性 ,JAAS 是可堆叠地 . 在单一登录地情形下 , 一组安全模块可以堆叠在一起 , 然后被其他地安全机制依据堆叠地次序被调用 .JAAS地实现者依据现在一些流行地安全结构模式和框架将 JASS模型化 . 例如可堆叠地特性同 Unix 下地可堆叠验证模块( PAM,Pluggable Authentication Module )框架就特殊相像 . 从事务地角度看 ,JAAS 类似于双步提交( Two-Phase Commit,2PC )协议地行为 .JAAS 中安全配置地概念(包括策略文件( Police File )和许可( Permission ))来自于 J2SE 1.2.JAAS 仍从其他成熟地安全框架中借鉴了许多思想 . 客户端和服务器端地 JAAS开发人员可以将 JAAS应用到客户端和服务器端 . 在客户端使用 JAAS很简洁 . 在服务器端使用 JAAS时情形要复杂一些 . 目前在应用服务器市场中地 JAAS产品仍不是很一样 , 使用 JAAS地 J2EE 应用服务器有一些微小地差别 . 例如 JBossSx 使用自己地结构 , 将 JAAS集成到了一个更大地安全框架中;而虽然 WebLogic6.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 对象.下面列。












