技术领域
本发明的实施例一般涉及软件应用开发,特别是涉及基于Java的安 全性和授权软件应用开发系统与方法。
背景技术
安全性和授权在软件系统的开发、部署和运行中扮演着非常重要的
角 色。可从美国加利福尼亚州圣塔克拉拉的Sun Microsystems公司获得的 Java是用于基于组件的软件与系统的最流行的平台。另外,Java安全性 在
电子商务企业系统中扮演着关键的角色。安全性特征典型地以即兴 (ad-hoc)的方式被内建到应用之中,或者与使用容器管理的认证和授权 的企业J2EE(Java2平台企业版)—可从美国加利福尼亚州圣塔克拉拉 的Sun Microsystems公司获得—应用集成在一起。这种情况有几个原因。 首先,安全性必须由应用的几乎全部组件处理;然而,其在软件开发中的 集成不是集中的。第二,缺乏用于开发有粒度的安全性(granular security) 的标准易用过程。在J2EE系统中,容器提供了方法级的安全性以及基于 角色的
访问控制,这对许多情况来说是不够的。总体来说,安全性开发的 低级别使得安全性实现僵硬且与应用紧密耦合。
Java认证与授权服务(JAAS)是一种Java包,其使得服务能够认 证用户和对用户强加访问控制。换言之,JAAS是可用于以下两个目的的 一组Java应用程序
接口(API):(1)用于用户的认证,以可靠且安全 地判定当前是谁在执行Java代码,而无论代码是作为应用、
小应用程序 (applet)、bean还是小服务程序(servlet)运行;以及(2)用于用户授 权,以判定被认证用户是否被允许访问资源(其可以为Java代码或由 Java代码访问的某对象/实体),而无论代码是作为应用、小应用程序、 bean还是小服务程序运行。典型地,JAAS认证以可插接的方式执行。这 允许Java应用保持对底层认证技术的独立性。另外,可在不需要对应用 本身进行
修改的情况下,插接新的或更新后的技术。
Java使用三种类型的防御机制:字节码检验器、类加载器以及安全性 管理器。在Java1.0版本中,小应用程序在“沙箱”(sandbox)中运行, 这限制了小应用程序对它们在其上执行的机器产生影响或从其获取任何敏 感信息的能
力。因此,不能本地访问任何较多的东西。在Java的较新版 本中,小应用程序被允许脱离沙箱,如果运行其的机器基于签名信息允许 其这样做的话。为了支持灵活的、细粒度的访问控制,Java1.2版本提供 了基于策略的安全性体系结构。该策略由一组用于不同
位置的并由不同签 名者签名的代码的
许可(permission)来定义。许可允许访问某个资源上 的某些动作。通常,在策略文件中列举资源名以及它们相关的动作。图1 示出了Java中典型的策略文件。
在Java2版本中,较早时候由SecurityManager提供的两个功能- 即安全性策略的建立和安全性策略的实施-被分开。java.secuiry.Policy抽 象类用于建立安全性策略,而Accesscontroller用作安全性实施器。为了向 后兼容,SecurityManager类仍旧存在,但它引用AccessController来做出 其决策。在java.policy中,许可与代码源(code-source)相关联。因此, 其不具有基于用户或角色的许可。图2示出了用于使用AccessController 保护Java方法的典型代码。图2所示的示例显示了如何通过在访问资源 前调用AccessController来保护资源。AccessController使用应用的当前授 权策略来检查所
请求的许可。如果策略文件中定义的任何许可暗含了所请 求的许可,则方法“checkPermission”命令简单地返回;否则,发起 AccessControlException。
如上面所提到的,JAAS是一组使服务能够对用户进行认证并强加访 问控制的API。JAAS可靠且安全地判定当前是谁在执行Java代码以及 其是否被允许这样做。另外,JAAS实现了标准可插接认证模
块(PAM)
框架的Java技术版本。这允许Java应用保持对底层认证机制的独立性。
JAAS包括两个主要组件:认证与授权。JAAS将基于主题(subject) 的策略添加到Java2版本的安全性模型中。不仅基于CodeSource而且基 于执行代码的用户授予许可。为此,首先对用户进行认证。JAAS分发版 包含各种LoginModule实现,以便从用户获取用户id和口令。LoginContext 使用登录配置文件来判定使用哪个LoginModule进行认证。Subject类用 于封装被认证用户的凭证(credential)。一主题可具有多个称为主体 (principal)的身份。在JAAS策略文件中,每个授予
声明(grant statement) 与一主体相关联。对于每个与主题相关联的主体,AccessController从 PolicyFile获取许可,并检查任何许可是否暗含着被请求的许可。否则, AccessController启动AccessControlException。图3示出了在JAAS中用 于基于主体的授权的典型策略。
在J2EE体系结构中,容器用作其所容纳的组件与它们的调用者之间 的授权界限。容器建立起调用代码的用户的标识。对被调用组件—EJB(可 从美国加利福尼亚州圣塔克拉拉的Sun Microsystems公司获得的 Enterprise JavaBeansTM)或web组件—的访问是通过将调用者的安全性 属性与访问被调用组件所需的那些安全性属性进行比较来判定的。在声明 性(declarative)授权中,部署者(deployer)为J2EE应用建立容器实施 的访问控制规则。部署者将应用许可模型—其典型地由应用组合者 (application assembler)提供—映射到特定于运行时环境的机制。部署描 述器(deployment descriptor)定义安全性角色及其关联的对各种组件的 访问权限。部署者向特定调用者分配安全性角色,以便在运行时环境中建 立用户的访问权限。例如,部署者可将安全性角色映射到操作环境中主体 身份的列表。于是,向以这些身份之一认证的调用者分配由该角色代表的 特权。J2EE容器在向组件发出方法调用之前做出访问控制决策。因此, 声明性访问控制可以方法的粒度被
指定。
J2EE容器不在这些访问决策中计入组件的逻辑或状态。为了实现这 一点,需要由代码开发者进行编程性授权。组件可使用两种方法来进行细 粒度访问控制:EJBContext.isCallerInRole(用于EJB组件)和 HttpServletRequest.isUserInRole(用于web组件)。组件使用这些方法判 定调用者是否已被授予由该组件基于调用参数、组件内部状态或例如运行 时参数等其他因素选择的特权。然而,存在着在声明性与编程性授权之间 的权衡。声明性授权是由部署者配置的外部访问控制策略,而编程性授权 是通过由组件开发者嵌入在应用中的内部策略进行的。内部策略粒度更细, 而外部策略更为灵活。另外,外部策略是透明的,而内部策略是掩藏在应 用中的。例如,为了提供“雇员仅可访问他们自己的薪酬信息”的授权策 略,需要编程性的授权,其不能在未来进行改变(如果需要的话)。
另外,JAAS建立在预先存在的Java安全性模型之上,该安全性模 型为基于CodeSource的且为纯文本格式的策略文件实现。JAAS基于由某 个组件访问的类实现授权。然而,这对企业应用来说可能是不够的,通过 企业应用,人们可能希望使用定制的安全性储存库(security repository), 例如带有JAAS的LDAP(轻量型目录访问协议)。另外,在企业间的电 子商务中,定价合同可能具有与其他合同不同的访问控制策略。用于自助 式拍卖应用的规格说明(specification)可能具有“任何注册用户可创建拍 卖但只有创建该拍卖的用户被允许对之进行修改”的要求。因此,要求许 多Java应用对JAAS进行扩展以便满足其授权要求。由于JAAS的可插 接特征,人们可编写其自己的多种认证和授权子模块实现,以便改变JAAS 的默认行为。对于上述示例中示出的授权要求,人们可能需要改变以下一 项或多项的默认实现:
·java.security.Permission:AccessController.checkPermission (Permission perm)被调用,以便判定调用者是否具有在被调用的 CodeSource上执行动作的授权。许可对象perm表示对资源的所要求的 访问。许可对象可指定例如许可名称(其可指示要求在其上的访问的资 源)、资源为之被访问的动作等等。许可类实现一暗含的方法,该方法 将由AccessController调用,以便判定被授予的许可是否暗含着所请求 的许可。为了实现类实例级的授权,需要具有新的许可实现,其具有作 为其字段之一的对象实例。该对象可用在所述暗含的方法中,以决定授 杈。
·java.security.PermissionCollection:这一抽象类用于表示许可对象的集 合(collection)。这一类可被实现为具有存储被授予的许可以及将它们 与所请求的许可进行比较以便判定任何所授予的许可是否暗含了所请 求的许可的所希望的方式。
·java.security.Policy:这是用于存储Java应用环境中的安全性策略的抽 象类。AccessController
接触策略实现,以便为被认证主题获取 CodeSource上的许可。策略对象查阅其策略规格说明,并返回适当的、 列举被允许的许可的PermissionCollection对象。默认地, sun.security.provider.PolicyFile实现用于策略实现。通过拥有不同的实 现,可以改变策略被编写的方式(例如,LDAP或软件应用)或者授权 所依赖的附加参数。
·javax.security.auth.spi.LoginModule:LoginModule描述由认证提供器 实现的接口。它从回调(callback)中检索用户名和口令,所述回调默 认地执行某些用户交互。LoginModule可被扩展为将认证委托给某个外 部适配器。
·java.security.Principal:Principal接口表示这样的抽象概念,其用于表 示实体,例如个人、组织、组或登录id。Group、KerberosPrincipal 等等是Principal的公知的实现。通过对Principal进行扩展,可以添加 将用于授权的定制属性。
然而,JAAS的一个限制在于其不支持类实例级的授权,也就是说, JAAS中的授权是在类名的
基础上执行的,而不是在类的特定实例的基础 上执行的。例如,用于基于web的自助式拍卖应用的规格说明可具有以下 要求:“任何注册(认证)用户可创建拍卖但只有创建该拍卖的用户可对 之进行修改”。这意味着任何用户可执行被编写为创建拍卖类实例的代码, 但只有拥有该实例的用户可执行被设计为对之进行修改的代码。通常,创 建拍卖实例的用户将是拥有者。这意味着,相同角色的人基于他们的属性 或他们在过去执行的动作可能具有不同的访问权限。不幸的是,使用JAAS 不能支持这种类型的授权。
JAAS授权扩展了使用安全性策略指定向执行代码授予何种访问权限 的现有Java安全性体系结构。如Java2版本平台所提供的这种安全性体 系结构是以代码为中心的。也就是说,基于代码特性—即代码来自哪里、 代码是否被数字签名以及如果被数字签名的话被谁数字签名—授予许可。 使用JAAS到Java2SDK(软件开发套件)的集成,java.security.Policy API 处理基于主体的查询,且默认的策略实现支持基于主体的授予条目。因此, 访问控制现在可基于哪一代码正在运行以及谁在运行该代码。
JAAS确实提供了支持实例级JAAS的机制。这是通过对JAAS使用 的某些类进行扩展实现的。然而,这种方法的主要缺点在于其不可扩展且 在不同域中的不同类型的授权将被提供的情况下需要创建新授权类以及大 量再加工。支持实例级授权的另一种选择是使用被编码为应用的一部分的 定制授权代码。通常,这是支持授权技术的最常用方法,且其主要缺点在 于不是基于标准的,这使得它难以适用于不同的应用。另外,由于代码是 应用的一部分,它难以维护,并且由于它是非一般(non-generic)的,它 通常不能在不同域中被重用。
因此,由于传统方法的缺点和限制,需要更加广泛适用的基于JAAS 的授权解决方案,该解决方案可应用于不同的域而不需要任何新代码。为 新的授权要求编写新代码使得难以在部署时改变授权设置。因此,所需要 的是具有编程性授权的高粒度的声明性授权的灵活性。
发明内容
鉴于上述情况,本发明的实施例提供了为访问由任何软件对象与应用 表示的资源、数据或代码的用户建立安全性和授权策略的方法,其中,该 方法包括:从
数据处理器上运行的应用对象描述文档产生至少一个应用对 象组;为各个应用对象组创建授权策略;向访问
控制器发送所选择的应用 对象;以及在部署软件应用时,基于授权策略,为试图访问所选择应用对 象的用户建立访问控制参数。在所述产生步骤中,应用对象描述文档包含 可扩展
标记语言(XML)格式。该方法还包括:为授权策略指定环境变量, 以及通过修改环境变量的声明性规格说明以及修改在应用对象的属性上定 义的约束来更改授权策略。另外,该方法还包括使用以下各项指定应用对 象组:与应用对象相关联的任何方法和字段参数(且在这些方法和字段参 数上定义约束);所有应用对象组之间的预定关系;或者将应用对象描述 文档解析(parse)到所述至少一个应用对象组中的预定分组动作。另外, 该方法还包括使用同一授权策略分类器实现不同类别的授权策略。
本发明的另一实施例提供了一种控制对软件应用的访问的方法,其中, 该方法包括根据分组参数将软件应用中的应用对象分组;为访问应用对象 的各类用户建立用户配置文件(user profile);指定包含用于每一被分组 的应用对象的访问控制参数的授权策略;以及在部署软件应用时,将授权 策略与用于试图访问被选择的分组应用对象的用户的用户配置文件相匹 配,其中,在所述分组步骤中,软件应用包含应用对象描述文档,该文档 包含应用对象,其中,应用对象描述文档包含XML格式。该方法还包括: 为授权策略指定环境变量,以及通过改变环境变量的声明性规格说明以及 分组约束更改授权策略。在所述分组步骤中,分组参数包含使用以下各项 指定应用对象:与应用对象相关联的任何方法和字段参数;软件应用中所 有应用对象之间的预定关系;或者将由软件应用/对象所表示的资源、数据 或代码解析到所述至少一个应用对象组中的预定分组动作。该方法还包括: 使用同一授权策略分类器实现不同类别的授权策略。
本发明的另一方面提供了一种用于为访问软件应用的用户建立安全性 和授权策略的系统,其中,该系统包含:用于由运行在数据处理器上的应 用对象描述文档产生至少一个应用对象组的装置;用于为各个应用对象组 指定授权策略的装置;用于向访问控制器发送所选择的应用对象组的装置; 以及用于基于授权策略在部署软件应用时为试图访问所选择应用对象组的 用户建立访问控制参数的装置。
本发明的另一实施例提供了一种用于控制对软件对象的访问的系统, 其中,该系统包含:应用对象描述文档,该文档包含至少一个应用对象组; 授权策略分类器,其适用于为各个应用对象组指定授权策略;以及访问控 制器,其适用于在部署软件对象时基于授权策略为试图访问所选择应用对 象组的用户建立访问控制参数,其中,应用对象描述文档包含XML格式, 且其中,授权策略包含环境变量。该系统还包含生成器例程,该例程适用 于通过修改环境变量和分组规则的声明性规格说明来改变授权策略。根据 该系统,使用以下各项来指定应用对象组:与用户选择的应用对象相关联 的任何方法和字段参数;所有应用对象组之间的预定关系;或者将应用对 象描述文档解析到所述至少一个应用对象组中的预定分组动作。另外,授 权策略分类器适用于实现不同类别的授权策略。
另外,本发明另一方面提供了计算机可读的一种程序存储设备,其有 形地体现了一种可由计算机执行以完成为访问软件应用的用户建立安全性 与授权策略的方法的指令程序,其中,该方法包括:由数据处理器上运行 的应用对象描述文档产生至少一个应用对象组;为各个应用对象组指定授 权策略;向访问控制器发送所选择的应用对象组;以及基于授权策略,在 部署软件应用时为试图访问所选择应用对象组的用户建立访问控制参数。
本发明的实施例所提供的授权技术提供了在不编写任何新代码的情况 下满足授权要求的方法,其中,可通过改变声明性设置在部署时获得新的 授权方案(authorization scenario)。另外,本发明的实施例提供了以下技 术:用XML格式表示不同的授权要求;使用对象约束逻辑为授权目的解 析和产生对象组;添加环境变量作为授权参数;定义被认证主体之间的关 系;使用同一授权策略提供器实现不同类别的授权策略;以及在部署时对 动作进行分组。
本发明的实施例的这些以及其他方面在结合下面的
说明书和
附图考虑 时可更好地理解。然而,应当理解,尽管下面的说明示出了本发明的优选 实施例及其大量具体细节,其仅作为例示而不是限定给出。
附图说明
参照附图,通过阅读下面的详细介绍,可以更好地理解本发明的实施 例,在附图中:
图1为用于Java的典型策略文件;
图2为用于使用AccessController保护Java方法的典型代码;
图3为用于JAAS中基于主体的授权的典型策略;
图4为根据本发明实施例用于使用GenericPermission保护方法的伪 代码;
图5为根据本发明实施例在一般(generic)授权中的授权策略;
图6为示出了本发明一实施例的优选方法的
流程图;
图7(a)为示出了本发明另一实施例的优选方法的流程图;
图7(b)为示出了本发明另一方面的优选方法的流程图;
图8为根据本发明一实施例的系统
框图;以及
图9为根据本发明一实施例的
计算机系统图。
具体实施方式
参照在附图中示出并在下面的介绍中详细描述的非限制性实施例更为 全面地阐释了本发明的实施例及其各种特征与有利细节。应当注意,附图 中所示的特征不一定是按比例绘制的。为了避免不必要地模糊本发明的实 施例,省略了对公知组件和处理技术的介绍。这里所用的实例仅为了有助 于理解可实践本发明的实施例的方式并进一步使本领域技术人员能够实践 本发明的实施例。因此,这些实例不应被理解为限制本发明的实施例的范 围。
如上所述,仍然需要更为广泛地适用的基于Java的软件应用开发技 术,该技术可应用于不同的域,而不需要对授权设置的重大改变。本发明 的实施例通过向基于JAAS标准的Java应用提供一般的、低级别的可扩 展安全性满足这种需求。现在参照附图、特别是图4至9,其中示出了本 发明的优选实施例。
如上所述,可以用不同的方式对JAAS进行扩展,以便达到各种认证 和授权目标。然而,对于各种扩展,人们可能需要编写代码来相应地实现 或扩展各种JAAS接口和类。因此,这使得难以在部署应用时改变安全性 设置。因此,本发明的实施例所提供的一般授权技术通过在保持编程性授 权的高粒度的同时使用声明性授权获得了这种灵活性。
因此,本发明的实施例所提供的授权技术使用声明性规格说明提供了 编程性授权的能力。具体而言,本发明的实施例对JAAS进行扩展,使得 授权要求可以用声明性方式而不是以编程性方式得到满足。需要使用认证 和授权保护的各个方法以对GenericPermission对象的构造器的调用开始, 该对象具有至少三个属性:该方法所属于的类;该方法想要执行的动作; 以及该方法在其上被调用的对象。图4示出了根据本发明的上述方面用于 使用GenericPermission保护方法的伪代码。
如图5所示,授权策略可以用XML格式表示。例如,如图5所示地 编写一种用于“任何注册用户可创建拍卖但仅创建该拍卖的用户被允许对 之进行修改”的授权策略。类似地,在对于不同的定价合同具有不同的授 权策略的情况下,许可基于{idname=“getContractID”,idtype=“method”, idvalue=“ibm-sun”)参数。
对于一般授权,为合适的授权策略提供器配置JDK。这是通过在 Java_home/jre/lib/security目录下的Java.security文件中改变/添加 auth.policy.provider实现的,其中,Java_home为系统中安装Java的路 径。即使存在着对于多个应用—每个应用具有自身的授权要求—只能有一 个授权策略提供器的限制,由于一般授权
覆盖了大量的授权策略,其可以 在同一机器上运行,而不必为每个应用编写单独的代码。
图6示出了为访问用软件对象/应用代表的资源、数据或代码的用户建 立安全性与授权策略的方法,其中,该方法包括:由运行在数据处理器上 的应用对象描述文档,产生(101)至少一个应用对象组;为各个应用对象 创建(103)授权策略;将用户选择的应用对象发送(105)到系统200的 访问控制器208(在图8中示出);以及在部署软件应用时基于授权策略 为试图访问被选择应用对象组的用户建立(107)访问控制参数。在产生步 骤(101)中,应用对象描述文档包含XML格式。该方法还包括:为授权 策略指定环境变量以及通过修改环境变量的声明性规格说明来改变授权策 略。另外,该方法还包括使用以下各项指定应用对象组:与所选择应用对 象相关联的任何方法和字段参数;所有应用对象组之间的预定关系;或将 应用对象描述文档解析到所述至少一个应用对象组中的预定分组动作。另 外,该方法还包括使用同一授权策略分类器实现不同类别的授权策略。
本发明的另一实施例如图7(a)所示,其示出了一种控制对由软件对 象/应用代表的资源、数据或代码的访问的方法,其中,该方法包括:根据 分组参数将软件应用中的应用对象分组(111),所述分组参数包含对象方 法调用结果、对象字段值以及环境变量中的一个或多个;为访问应用对象 的每一类用户建立(113)用户配置文件;指定(115)包含用于每一被分 组的应用对象的访问控制参数的授权策略;以及在部署软件应用时,将授 权策略与用于试图访问被选择分组应用对象的用户的用户配置文件相匹配 (117),其中,在分组(111)步骤中,软件应用包含应用对象描述文档, 该文档包含应用对象,其中,应用对象描述文档包含XML格式。
另外,在分组(111)步骤中,分组参数包含使用以下各项指定应用对 象:与应用对象相关联的任何方法和字段参数;软件应用中所有应用对象 之间的预定关系;或将用户选择的软件对象解析到所述至少一个应用对象 组中的预定分组动作。如图7(b)所示,该方法还包括:为授权策略指定 (119)环境变量;以及通过修改环境变量的声明性规格说明改变(121) 授权策略。该方法还包括使用同一授权策略分类器实现不同类别的授权策 略。
根据编写授权策略的方法,本发明的实施例允许访问某些与安全性相 关的环境变量,从而策略可依赖于这些变量。这使得有可能具有这样的 策略,例如“允许A在工作日访问的软件应用但在周末则不允许”。
图8示出了用于控制对软件应用的访问的系统200,其中,系统200 包含:应用对象描述文档202,该文档包含至少一个应用对象组204;授权 策略分类器206,其适用于为各个应用对象组204指定授权策略;以及访 问控制器208,其适用于在部署软件应用时基于授权策略为试图访问所选 择应用对象组204的用户210建立访问控制参数,其中,应用对象描述文 档202包含XML格式,且其中,授权策略包含环境变量。
该系统还包含生成器例程212,该例程适用于通过修改环境变量的声 明性规格说明来改变授权策略。根据系统200,使用以下各项来指定应用 对象组204:与应用对象组204相关联的任何方法和字段参数;所有应用 对象组204之间的预定关系;或者将应用对象描述文档202解析到所述至 少一个应用对象组204中的预定分组动作。另外,授权策略分类器206适 用于实现不同类别的授权策略。
本发明的实施例提供了一种解析对象约束逻辑(编写在XML文件中) 以及出于授权目的产生对象组的技术。传统上,在JAAS中,授权策略是 在类(代码)级别编写的。与之相反的是,根据本发明的实施例,授权策 略是以对象组的粒度编写的。使用相关对象的方法/字段表示对象组。例如, 在JAAS中,假设存在称为“contract”(合同)的类,所有的合同将具有 同样的授权属性,但在本发明的实施例提供的一般授权中,可允许用户更 新与“Sun”(Sun是位于美国加利福尼亚州圣塔克拉拉的Sun Microsystems公司的注册商标)的合同,但不允许更新“Microsoft” (Microsoft是位于美国华盛顿州雷蒙德的Microsoft公司的注册商标)的 合同。在JAAS中,在应用对象上的授权不依赖于应用对象的特性。因此, 所有的应用对象具有相同的授权规则。为了避免这一点,典型地以传统方 法进行定制授权。与此相反的是,本发明的实施例提供了允许个人使用 JAAS进行实例级授权(即依赖于数据对象的特性的授权)的技术。
本发明提供的方法定义了被认证主体之间的关系。传统上,在JAAS 中,当用户被认证时,用户由“Subject”类型的对象表示。每个主题可具 有与之相关联的多个主体。这些主体表示该人可具有的不同身份。因此, 一人可由其名字(这是一个主体)或其社会安全号码(这是另一个主体) 唯一地标识。然而,使用本发明的实施例提供的基于XML的表示,可定 义例如“如果该用户(被认证主体)是对象所有者的管理者(这里,该对 象可以是关于请假
申请的),那么允许他调用批准方法”的策略。再次地, 由于本发明的实施例提供了允许个人使用JAAS进行实例级授权(即依赖 于数据对象的特性的授权)的技术,这是有利的。进一步地,这是以声明 性方式进行的,其与编程性授权相比更为灵活。另外,使用这种设置,对 象之间的动态关系可被用于授权目的。在该示例中,策略是根据被认证主 体之间的关系(管理者)定义的。
接着,本发明的实施例提供了一种方法,通过该方法,可使用同一授 权策略提供器实现不同类别的授权策略。在java_home/jre/lib/security目 录下的java.security文件中配置授权提供器。对于Java
虚拟机(JVM), 通过改变java.security文件的属性auth.policy.provider对之进行配置。即 使存在着只能有一个授权策略提供器的限制,由于一般授权覆盖了大量的 授权策略,多个应用—各个应用具有自身的授权要求—可以在同一JVM上 运行。由于本发明的实施例具有单个XML授权文件,该文件可对于不同 的应用具有不同授权规则。将根据特定于该应用的应用对象定义每个授权 规则。另外,授权基础结构将使用该单个授权文件。因此,可使用同一授 权策略提供器实现不同类别的授权策略。
本发明的实施例还提供了在部署时对动作进行分组的方法。可对动作 进行分组,以便为不同组的动作提供不同的授权要求。在部署时,可以决 定同一授权将被用于例如“读取”和“搜索”动作。这一点在授权策略被 存储在授权XML文件中时实现。在部署时,通过简单地改变XML,可实 现上述动作分组。
接着,本发明的实施例提供了一种在不必编写任何新代码的情况下满 足授权要求的方法。在部署时,通过改变声明性设置,可获得新的授权方 案。这是如上所述简单地通过地改变XML实现的。因此,本发明的实施 例提供了新的策略,其不需要对代码进行改变。由于授权要求以XML表 示而不是将之与应用相集成,可通过简单地改变XML(而不是代码改变) 来改变授权设置。在本发明的实施例提供的、基于XML的策略文件中, 如果用户主体具有用某个“类似于Javabean”的方法—例如getOwner、 getManager等—的返回值表示的某些特性,则它被许可访问某个Java对 象。
本发明的实施例还包含一种以XML格式表示不同授权要求的方法。 该格式包括使用在Java对象上的某些字段或方法调用指定对象,使用关 系指定主体,以及对动作进行分类。本发明的实施例还以XML格式表示 例如时间、日等环境变量,并在这些变量上定义授权策略。这一点特别有 利,因为通过包括若干方法来以XML格式标识对象,本发明的实施例可 产生用于授权设置的大量选项。这些选项包括:Java对象的字段值和方法 返回值、主体及其之间的关系、以及环境变量等等。因此,本发明的实施 例可在部署时改变授权策略,其可利用JAAS标准。换言之,通过在不利 用编程性授权情况下的实例级的授权,可获得JAAS的优点。
另外,本发明的实施例提供了一般许可类,其具有允许传递将在其上 检查授权的对象和/或做出访问请求的对象的构造器。传统上,在JAAS中, 需要Permission对象以便使用访问控制器对许可进行检查。与之相反的是, 根据本发明的实施例所提供的方法,使用GenericPermission对Permission 类进行扩展,从而在其上要求许可的对象是被传送到访问控制器208的 Permission对象的参数。因此,访问控制器208可基于被传送到它的对象 对授权作出决策。该方面用于基于将在其上做出授权决策的应用对象的特 定实例的特性提供授权规则。如上所述,在JAAS中,授权策略独立于应 用对象的实例,且策略对于同一类别的应用对象的所有实例来说是相同的。 通过使用利用将对象实例作为参数的一般许可类的上述技术,本发明的实 施例可提供实例级的授权。
接着,本发明的实施例提供了一般策略文件,其允许使用环境变量, 允许使用反射(reflection)的动态方法调用的表示,允许表达式 (expression)、谓词逻辑(predicated logic)的表示等等。例如,本发明 的实施例提供了编写授权要求的格式。该格式包括使用Java对象上的某 字段或方法调用指定对象、使用关系指定主体、以及对动作进行分组。本 发明的实施例还以XML格式表示例如时间、日等环境变量,并在这些变 量上定义授权策略。
另外,本发明的实施例提供了一种Policy File实现,其解析一般策略 文件,理解Generic Policy File的语法,并基于过去的用户Object、用户 Principal/用户Subject以及用户代码从Generic Policy File创建 GenericPermissionCollection。这是通过使用新类型的GenericPermission 类实现的,由此,使用不同类型的策略文件实现。因此,本发明的实施例 理解Generic Policy File的一般格式,但不必理解在该策略文件中指定的 对象约束逻辑。然而,这种实现使用该策略文件创建GenericPermission 类。因此,如上所述,GenericPermission类理解在策略文件中指定的对象 约束逻辑。
因此,本发明的实施例使用GenericPermission类,该类使用策略文 件,理解策略语言的声明性规格说明,并能够得到环境变量的值,对表达 式以及谓词逻辑(predicate logic)求值,以及使用Java反射来获取运行 时参数值。换言之,本发明的实施例理解在基于XML的一般策略文件中 编写的逻辑。
另外,本发明的实施例提供GenericPermission Collection类,其存储 GenericPermission的集合,并调用GenericPermission的暗含方法,其能 够理解Generic Policy File。一般地,本发明的实施例定义了将对象作为参 数之一的许可的一般集合,其在JAAS环境中根据JAAS规范工作。具体 而言,本发明的实施例提供了基于Java的策略,该策略提供XML格式定 义的访问控制或授权。以XML格式声明性地指定环境变量,以便定义用 于Java的授权策略的授权参数。XML是独立于应用的,且声明性变量的 使用通过以XML定义类、方法和对象的Java参数而允许一般授权。以 XML描述几种不同的策略,且这些策略被声明为环境变量。为了改变授权 策略,对环境变量的声明进行修改。另外,各应用可具有不同的策略,并 可在用户使用特定的用户名与口令登录时用XML格式声明性地进行指定。
图9示出了用于实践本发明的实施例的代表性
硬件环境。该原理图示 出了根据本发明的实施例的信息处理/计算机系统的硬件配置。该系统包括 至少一个处理器或中央处理单元(CPU)10。CPU10经由
系统总线12互 连到各种设备,例如随机存取
存储器(RAM)14、
只读存储器(ROM) 16以及输入/输出(I/O)适配器18。I/O适配器18可连接到
外围设备,例 如盘单元11和磁带
驱动器13,或可由系统读取的其他程序存储设备。系 统可读取程序存储设备上的本发明的指令,并遵循这些指令以执行本发明 的实施例的方法。系统还包含用户接口适配器19,其将
键盘15、
鼠标17、 扬声器24、麦克
风22和/或例如
触摸屏设备(未示出)等其他用户接口设 备连接到总线12,以便收集用户输入。另外,通信适配器20将总线12连 接到数据处理网络25,而显示适配器21将总线12连接到显示设备23,该 显示设备23可体现为例如监视器、
打印机或发射器等输出设备。
本发明的实施例所提供的授权技术提供了一种在不编写任何新代码的 情况下满足授权要求的方法,其中,可在部署时通过改变声明性设置获取 新的授权方案。另外,本发明的实施例提供了以下技术:以XML格式表 示不同的授权要求;出于授权目的,使用对象约束逻辑解析和产生对象组; 添加环境变量作为授权参数;定义被认证主体之间的关系;使用同一授权 策略提供器实现不同类别的授权策略;以及在部署时对动作进行分组。本 发明的实施例可用于J2EE/非J2EE环境中的所有Java应用。另外,这 里介绍的环境适用于所有J2EE/非J2EE应用。