OSGi R4服务平台核心规范 :第九章 条件权限管理规范(3)

 由  满江红开放技术研究组织 发布

9.8.标准条件式

本标准提供了一系列的标准条件式。OSGi规范中的JAR文件中包含了规范的类,在JAR文件中,也包含了关于这些条件式的非功能实现。框架的实现者必须实现这些类,并替代原来的非功能实现类,这些类的实现和框架的有效性相关。

9.8.1.Bundle签名条件式

当条件式的相关bundle是采用了和条件式参数匹配的证书进行签名时候,那么这个bundle签名条件式是满足的。也就是,这个条件式可以用于来给按照指定规则进行签名的bundle分配权限,必须通过静态方法getCondition(Bundle,ConditionInfo)来创建bundle签名条件式。其中的字符串参数是和证书匹配中定义的DN名称进行匹配。例如:

[ ...BundleignerCondition "* ;cn=S&V, o=Tweety Inc., c=US"]

bundle签名条件式不是易变的,而且可以在调用getCondition方法时进行全部计算。

9.8.2.Bundle位置条件式

bundle位置条件式中的参数和相关bundle的位置参数进行匹配。bundle位置的匹配提供了很多签名的优势而且没有额外开销。但是,使用位置来进行校验需要确保下载的位置是安全的,而且不能被诱骗。例如,操作者也许会允许可以从指定位置下载对某个企业的相关bundle。为了使这样的下载安全,最少应该使用HTTPS协议。然后操作者才可以使用位置来分配权限。

https://www.acme.com/download/* Apps from ACME

https://www.operator.com/download/* Operator apps

必须要通过它的静态方法getCondition(Bundle,ConditionInfo)来创建bundle位置条件式。字符串参数是一个位置字符串,可以使用通配符“*”。通配符的匹配是采用过滤器字符串匹配机制。例如:

http://www.acme.com/*

://www.acme.com/

当这个位置参数和bundle的位置字符串匹配的时候,bundle位置条件式满足。

bundle位置条件式不是易变的,而且可以在调用getCondition方法时进行全部计算。

9.9.bundle权限资源

bundle可以使用文件OSGI-INF/permissions.perm来传送局部权限。这必须是一个采用UTF-8编码的文件,文件格式采用行形式,对于每一行不限制长度但是必须要可以通过BufferedReader的readLine方法来读取:

  permission.perm ::= line *
  line ::= ( comment | pinfo ) ’\r\n’
  comment ::= ( ’#’ | ’//’ | /* blank */ )
  pinfo ::= ’(’ qname quoted-string
  quoted-string ’)’  // 参阅1.4.2

每一个权限必须要是在一行中使用Permission Info的格式进行描述。在行中可以使用注释。使用#和//开始的行是注释行,行的起始空格是忽略处理的。引号外的多个空格看作是一个空格。

例如(…为适当的包前缀):

  # Friday, Feb 24 2005
  # ACME, chess game
  ( ..ServicePermission "..log.LogService" "GET" )
  ( ..PackagePermission "..log" "IMPORT" )
  ( ..ServicePermission "..cm.ManagedService" "REGISTER" )
  ( ..PackagePermission "..cm" "IMPORT" )
  ( ..ServicePermission "..useradmin.UserAdmin" "GET" )
  ( ..PackagePermission "..cm" "SET" )
  ( ..PackagePermission "com.acme.chess" "IMPORT,EXPORT" )
  ( ..PackagePermission "com.acme.score" "IMPORT" )

如果再bundle的JAR文件中有如上文件,那么将对本地权限进行设置。

如果没有上述文件,那么本地权限为所有权限。

9.9.1.移除bundle权限资源

攻击者可以通过删除bundle中的permissions.perm文件来获得本地权限。这样也会删除bundle的签名者需要的权限。为了防止这种攻击,条件权限管理(Conditional Permission Admin)必须检测到permissions.perm资源,也就是,已经在清单文件中列出,但是却不在JAR中。如果检测时,正在进行bundle安装,那么安装过程必将失败,而且抛出bundle异常。

9.10.与权限管理的关系

如果框架提供了条件权限管理服务和权限管理服务,那么权限管理服务提供的信息必须覆盖条件权限管理服务提供的相同信息,只有在权限管理服务没有提供的情况下,条件权限管理才会生效。

权限管理定义了缺省权限的概念,而条件权限管理不支持缺省权限。缺省权限使用一组空的条件来模仿。条件式空集应用于所有的bundle,除此之外,还有一些具体的条件式。这和权限管理是不一样的,在权限管理中,只有当bundle没有位置界限权限时才应用缺省权限。因此,如果存在条件权限管理,那么是决不会使用权限管理的缺省条件式的。

新的应用应该使用条件权限管理服务。在以后的发布版本中,将废弃权限管理服务。

9.11.安全

9.11.1.服务注册安全

9.11.1.1.条件权限管理服务

条件权限管理服务应该是框架的一部分,因此具有所有的权限。

9.11.1.2.客户端

设置权限的条件权限服务客户端必须要用有所有的权限,这是由于它们可以将所有权限赋予给其他bundle。

9.12.org.osgi.service.condpermadmin

OSGi条件权限管理规范版本1.0。

需要使用这个包的bundle必须在清单头标Import-Package中列出这个包,例如:

  The OSGi Conditional Permission Admin Specification Version 1.0.
Import-Package: org.osgi.service.condpermadmin; version=1.0

9.12.1.总结

  • BundleLocationCondition – 测试bundle的位置是否和一个模式串匹配的条件式。[p.237]
  • BundleignerCondition – 用于测试bundle的签名者是否和一个模式串匹配的条件式。[p.237]
  • Condition – 条件式接口。 [p.238]
  • ConditionalPermissionAdmin – 为管理条件权限的框架服务。[p.239]
  • ConditionalPermissionInfo – 绑定了一系列权限的条件式集合。[p.240]
  • ConditionInfo – 使用条件权限管理服务的条件式表达形式。[p.241]

9.12.2.public class BundleLocationCondition

测试bundle的位置是否和模式串匹配的条件式。模式匹配使用过滤字符串的匹配机制。

9.12.2.1.public static Condition getCondition( Bundle bundle, ConditionInfo info )

bundle

待计算的bundle

info

构造条件式的ConditionInfo对象。这个ConditionInfo对象的参数必须是一个单独的字符串指定了匹配的位置模式串。根据过滤器字符串匹配机制进行匹配。其中“*”当作是通配符,除非使用了“\”转义。

 

构造一个条件式来尝试对传递的bundle的位置和位置模式串进行匹配。

Returns 

请求条件的条件式对象。

9.12.3.public class BundleignerCondition

用于测试bundle签名者是否和模式串匹配的条件式。由于只有当更新bundle时才可以改变bundle的签名者,所以这是一个不易变的条件式。

条件式中使用一个DN名称链字符串来匹配bundle的签名者。DN名称的编码使用IETF RFC 2253。通常,签名者使用证书授权来发布证书,证书授权中也包括一个对应的DN和证书。可以形成一个可信的证书授权链,最后的DN和证书是框架所认可的。bundle的签名者的描述如下:签名者的DN,然后是发行者的DN,然后是发行发行者的DN,直到一个根证书的DN。对于每一个DN,用分号隔开。

如果bundle的一个签名者具有一个DN链和构造条件式的DN链匹配,那么bundle可以满足这个条件式。可以使用通配符(“”),这样在指定DN链中的匹配具有更大的灵活性。通配符可以用来代替DN名称,RDN名称或者是一个RDN的值。如果使用通配符来代替一个RDN的值,那么这个通配符必须是“”,那么可以匹配RDN中相应类型的所有值。如果通配符用来代替一个RDN,那么必须是第一个RDN,而且可以匹配任意数目的RDNs(包括0个RDNs)。

9.12.3.1.public static Condition getCondition( Bundle bundle, ConditionInfo info )

bundle

待计算的bundle

info

用于构造条件式的ConditionInfo对象。ConditionInfo对象的参数是一个字符串,指定了和bundle签名者进行匹配的DN名称链。

 

构造一个条件式,尝试对传递的bundle的位置和给定的位置模式串进行匹配。

Returns 

对指定bundle的签名者进行检查的条件式

9.12.4.public interface Condition

条件式的接口。使用条件权限信息(ConditionalPermissionInfo)来限制权限。其中,ConditionalPermissionInfo的权限只能在相关条件式满足的情况下使用。

9.12.4.1.public static final Condition FALSE

条件式对象,计算结果为false,而且从不延迟计算。

9.12.4.2.public static final Condition TRUE

条件式对象,计算结果为true,而且从不延迟计算。

9.12.4.3.public boolean isMutable( )

 

返回条件式是否为易变的。

Returns 

如果返回true,表示isSatisfied()[p.239]方法的返回值是可以改变的;

否则false表示这个方法的返回值是不能改变的。

9.12.4.4.public boolean isPostponed( )

 

返回计算是否必须要延迟到权限检查的最后进行。如果对条件式的计算必须延迟到权限检查最后进行,那么返回true,如果返回false,那么条件式必须对方法isSatisfied()[p.239]的调用能直接返回值。也就是说,方法,isSatisfied()直接返回,而不需要进行其他考虑,如用户的同意等。

Returns 

返回true表示计算必须要延迟进行,否则,false表示对计算必须要能直接运行。

9.12.4.5.public boolean isSatisfied( )

 

返回是否满足条件式。

Returns 

如果满足条件式,返回true,否则返回false

9.12.4.6.public boolean isSatisfied( Condition[] conditions, Dictionary context )

conditions

条件数组

context

实现者可以用来跟踪状态的Dictionary对象。如果在同一个权限计算中多次调用这个方法,那么将多次传递这个Dictionary对象。安全管理器将这个Dictionary对象看作是一个不传导的对象,如果需要多次调用,那么安全管理器简单创建一个空的Dictionary来传递给子调用。

 

返回是否满足Condition集合。尽管这个方法不是静态的,但是必须要实现为静态形式。所有传递的条件式具有同样的类型,而且和调用这个方法的对象的类型相应。

Returns 

如果所有的条件式满足,返回true,否则,只要有一个条件式不满足,返回false。

9.12.5.public interface ConditionalPermissionAdmin

管理条件权限的框架服务。可以将条件权限添加到框架,从框架中获得和删除条件权限。

9.12.5.1.public ConditionalPermissionInfo addConditionalPermissionInfo(ConditionInfo[] conds, PermissionInfo[] perms )

conds

为具有相应权限而需要满足的条件式集合

perms

当满足相应条件式而具有的权限

 

川剧一个新的条件权限信息(ConditionalPermissionInfo)对象。这个对象具有惟一的,不会重用的名称。

Returns 

指定条件和权限的ConditionalPermissionInfo对象

Throws

SecurityException – 如果调用这没有AllPermission权限

9.12.5.2.public AccessControlContext getAccessControlContext( String[] signers)

signers

返回的访问控制上下文(AccessControlContext)对象的签名者

 

返回指定签名者的AccessControlContext对象。

Returns 

具有和指定签名者相关权限的AccessControlContext对象。

9.12.5.3.public ConditionalPermissionInfo getConditionalPermissionInfo( String name)

name

返回的ConditionalPermissionInfo对象的名称

 

返回指定名称的ConditionalPermissionInfo对象

Returns 

指定名称的ConditionalPermissionInfo对象

9.12.5.4.public Enumeration getConditionalPermissionInfos( )

 

返回由当前的条件权限管理(ConditionalPermissionAdmin)对象管理的条件权限信息(ConditionalPermissionInfos)对象集合。调用这个方法ConditionalPermissionInfo.delete()[p.240]将删除从条件权限管理对象中删除这个条件权限信息对象。

Returns 

当前的ConditionalPermissionAdmin管理的ConditionalPermissionInfos对象的枚举

9.12.5.5.public ConditionalPermissionInfo setConditionalPermissionInfo( String name, ConditionInfo[] conds, PermissionInfo[] perms )

name

条件权限信息对象的名称,或者为null值

conds

为了获得相应权限需要满足的条件式

perms

当满足了相应条件式后具有的权限

 

通过一个指定的名称设置或者创建一个ConditionalPermissionInfo对象。如果指定的名称为null,那么必须要创建一个ConditionalPermissionInfo对象,而且必须分配一个惟一的,不会重用的名称。如果没有和当前的名称匹配的ConditionalPermissionInfo对象,那么必须使用指定的名称创建一个ConditionalPermissionInfo对象。否则,更新名称为指定名称的这个ConditionalPermissionInfo对象。

Returns 

指定名称、条件式和权限的ConditionalPermissionInfo对象

Throws

SecurityException – 如果调用这没有AllPermission权限

9.12.6.public interface ConditionalPermissionInfo

条件式集合和权限集合的汇集。这个接口的实例来自于条件权限管理服务(Conditional Permission Admin service)。

9.12.6.1.public void delete( )

 

删除来自于Conditional Permission Admin的ConditionalPermissionInfo对象

Throws

SecurityException – 如果调用这没有AllPermission权限

9.12.6.2.public ConditionInfo[] getConditionInfos( )

 

返回为了获得权限必须满足的条件式的条件信息(ConditionInfo)

Returns 

在这个条件权限信息(ConditionalPermissionInfo)对象中,条件式的条件信息(ConditionInfo)。

9.12.6.3.public String getName( )

 

返回ConditionalPermissionInfo对象的名称

Returns 

ConditionalPermissionInfo对象的名称

9.12.6.4.public PermissionInfo[] getPermissionInfos( )

 

返回ConditionalPermissionInfo对象的权限的PermissionInfo对象集合

Returns 

ConditionalPermissionInfo对象的权限的PermissionInfo对象集合

9.12.7.public class ConditionInfo

使用条件权限管理服务的条件表示。在这个类中封装了两部分信息:条件类型(类型名称,必须要是实现了Condition接口),和传递给构造方法的参数。

同时Condition类必须:

  • 声明一个静态的getCondition方法,并且使用一个Bundle对象和一个ConditionInfo对象作为参数。这个方法返回一个实现了Condition接口的实例对象。
  • 实现了Condition接口,定义了一个公有的带有一个Bundle对象和ConditionInfo对象的参数的构造方法。

9.12.7.1.public ConditionInfo( String type, String[] args )

type

这个ConditionInfo对象表示的Condition对象的类名称。

args

Condition类的参数。对于最近创建的Condition对象调用getArgs()[p.242]方法的返回值为这个参数。

 

通过指定类型和参数来创建一个ConditionInfo对象。

Throws

NullPointerException – 如果类型null。

9.12.7.2.public ConditionInfo( String encodedCondition )

encodedCondition

编码的ConditionInfo。

 

通过指定ConditionInfo对象的编码字符串来创建ConditionInfo对象。在编码中忽略处理空格。

Throws

IllegalArgumentException – 如果参数encodedCondition具有不适当的格式。

See Also

getEncoded[p.242]

9.12.7.3.public boolean equals( Object obj )

obj

与ConditionInfo对象相比较的对象。

 

判断两个ConditionInfo对象是否相等。这个方法检查参数obj对象是否和这个ConditionInfo对象具有相同的类型和args参数。

Returns 

如果obj是一个ConditionInfo对象,而且和这个ConditionInfo对象具有相同的类型和args参数,返回true。

否则返回false。

9.12.7.4.public final String[] getArgs( )

 

返回这个ConditionInfo 对象的args参数。

Returns 

返回ConditionInfo对象的args参数。

如果这个ConditionInfo对象没有args参数,那么返回一个空的数组。

9.12.7.5.public final String getEncoded( )

 

返回这个ConditionInfo对象的编码字符串,字符串采用一个合适的格式来存储这个ConditionInfo对象。

编码格式如下:

 [type “arg0” “arg1” ...]

其中每一个arg都是相应语法分析的编码。对于换行符通过“\”来转义。

在编码字符串中没有起始和终止的空格符。在type和“arg0”,以及arg之间都有一个空格符。

Returns 

ConditionInfo对象的编码字符串。

9.12.7.6.public final String getType( )

 

返回这个ConditionInfo所代表的Condition类的全名类名称

Returns 

这个ConditionInfo所代表的Condition类的全名类名称。

9.12.7.7.public int hashCode( )

 

返回这个ConditionInfo类的哈希码

Returns 

这个ConditionInfo类的哈希码。

9.12.7.8.public String toString( )

 

返回这个ConditionInfo类的表示字符串。可以通过调用这个对象的getEncoded方法来创建这个字符串

Returns 

这个ConditionInfo类的表示字符串。

9.13.参考

[46]Java 1.3   http://java.sun.com/j2se/1.3

查看评论