家庭网络环境下基于OSGI的灵活授权

来源:互联网 发布:知乎的经典评论 编辑:程序博客网 时间:2024/06/08 06:02

摘要:在家庭网络环境下,OSGi平台在控制不同用户进行访问时,授权就显得非常重要。OSGi平台虽然支持基于角色的访问控制(RBAC),但并不支持RBAC模型中的所有功能。本文针对OSGi平台动态部署不足的问题,通过增加了相对角色的概念并使用委托模型激活了其访问控制,提出了一个多样化的访问控制机制,扩展了OSGi平台现有的授权机制。

 

关键词:授权;OSGi;RBAC;委托模型;访问控制

 


1.引言

家庭网络是智能家居系统的前提和基础,它是一个特殊的分布计算环境,由各种异构的设备构成,如电脑、机顶盒、传感器、信息家电等。因此,家庭网络中用来互联各种设备的开放式标准接口成为研究的热点。其中,OSGi平台所提供的基于Java的开放标准编程接口,能够完成家庭中各种设备的通信和控制,主要关注于设备间服务的部署和管理。

 

目前,随着家庭网络中服务类型和设备类型不断增长、变化,安装单个服务或设备的情况也越来越多。OSGi框架为动态开发、部署模块化的应用程序和库的提供了环境。OSGi平台现有的访问控制机制主要支持role-user-permission映射的RBAC基本形式。但是,传统的研究并未涉及到OSGi平台动态部署服务的能力不足的问题。例如家庭网络中新加入的设备需要独立地安装服务,OSGi平台现有的授权机制无法为新服务提供合适的访问控制机制。本文针对该问题,通过增加了相对角色的概念并使用委托模型激活了其访问控制,提出了一个多样化的访问控制机制,扩展了OSGi平台现有的授权机制;同时采用了面向切面编程(AOP)模式,从扩展的访问控制机制中分离开了主要业务逻辑和安全控制内容。

 

2.灵活的授权机制

本节定义了相对角色的概念,并且提出了一个有效的机制,将相对角色和委托类应用到已存在的OSGi授权机制中。此外,还提出一个使用面向切面编程模式的访问控制方法。该授权机制如图1所示,某服务 bundle的Activator类将角色和委托类注册在角色库(RoleRegistry)中。当某用户试图访问服务时,切面授权模块(AspectAuthroization Module)切入进来,然后激活注册在角色库中角色和委托类的访问控制。以下小节描述了该授权机制的构成要素和细节。


图1

 

2.1 相对角色

传统的RBAC模型包含了如用户、角色、权限、UA、PA等基本对象。其中,UA描述了用户和角色间的关系,PA描述了角色和权限间的关系。用户根据其职权和责任来分配角色;为了能够在组织中访问资源,权限被分配进合适的角色中。在OSGi平台中,用户、角色、权限三个对象分别被描述为用户、用户组和行为组。某用户是否属于一个拥有权限的角色决定了该用户被授予或拒绝访问特定的服务。因此,使用Authorization.hasRole方法来判断该用户是否拥有在对象上的操作权限。图2描述了在激活一个名为Device1的设备时使用Authorization类进行访问控制。若某用户属于Device1_Owner行为组,则允许访问Device1。


图2

 

角色可以划分为两种类型:一种与传统RBAC模型中使用的角色一样,直接将角色分配给用户;另一种角色分离了访问控制属性和逻辑,该逻辑决定某用户是否属于某角色。第一种角色被称为绝对角色,第二种称为相对角色。如若图2中的代码被修改为图3的版本,访问控制仅通过验证某用户是否为某设备的所有者来实施。即不必将用户分配进Device1_Owner行为组中,这样就不必改变对应的状态,因而也就更加高效。图3中的访问控制类型就是一个带有设备属性的相对角色。


图3

 

2.2 委托模型

 为控制用户的服务访问,上节描述了一个有效的方法,使用带有对象新属性的访问控制模型,而不是标准的RBAC模型来检验用户-角色和角色-权限间的关系。但是,若按上述内容实现,授权机制也许已经从Authorization类中分离出来,这对于服务管理员来说,是很难管理框架的。因此,需要在访问控制的函数以及支持可管理的相对角色(与委托类相关)的函数中指定一个target参数。

 为支持实施访问控制逻辑的相对角色概念,需要注册和管理实现了Role接口的角色类以及继承自Rolebehaviour类的委托类。该委托类不是Authorization类,它实现了与角色权限相联的授权过程。Rolebehaviour类有一个hasRole方法实现授权的验证。

 

boolean hasRole(User user, Role role,Object target);

 

user参数表示试图访问服务的用户;role参数是用来传递与委托类相关的角色对象。target参数是作为支持相对角色的条件,表示与访问控制相关的某些对象或属性的信息。在role参数使用中,委托类和角色可以有一对多的关系。下列代码是一个角色对象的条件语句的例子。

 

if (ROLE1.equals(role)){ ..} else if ((ROLE2.equals(role)) { }

 

Java注释用于从其声明处标记该目标参数。3.5节详述了使用AOP实施访问控制的过程及Java注释的内容。

 

public void activateDevice(@RoleTargetParam Device device){...}

 

该委托模型允许该bundle的开发者实施动态访问控制机制。图4显示了使用委托类实现的图3中的代码。所有设备的访问控制可以通过验证设备的已注册所有者信息来实施,而不是通过在subject-object-role映射表增加每个设备来实施。此外,在设备所有者改变的情况下,访问控制也可以不用改变访问控制策略而继续实施。


图4

 

2.3 角色库

 

本模型使用RoleRegistry来管理委托类。通过在BundleContext中增加下列API方法,也可以在RoleRegistry进行角色管理。

 

public void addRole(Role r,RoleBehaviourbh);

 

public void setRole(Role r,RoleBehaviourbh);

 

addRole方法被用来注册一个与同一角色相联系的不同的委托类。而SetRole方法被用来使用一个新的委托类代替一个已存在的委托类。

 

角色根据其显示范围可分为全局类型和局部类型。相对于其他的bundle来说,全局角色是一个开放的角色,它能通过调用addRole方法在其他的bundle上增加新的委托类。而局部角色则不能在其他的bundle中增加一个新的委托类。在OSGi平台中,bundle间的模块化和依赖性均使用元文件的方式进行描述,下列的头信息将被建立作为bundle间的共享和访问限制。

 

Export-Package: 定义向其他bundle提供的共享包。

 

Import-Package: 定义从其他bundle中共享过来的包。

 

为发布某个全局角色,与包含了全局角色的bundle相关的开发者或打包者,应当指定Export-Package的包头的值为拥有角色类的包,同样地,Import-Package的包头信息应当包含在其他bundle的元文件中。为在全局角色中增加委托类,可以使用如下方法:

 

addRoleBehaviour(Class cl,RoleBehaviourbh, int linkType)

 

C1参数表示角色的类型,linkType参数表示与增加的委托类之间的关系。委托类间的关系可以有三个值:HEAD_CHAINED, REAR_CHAINED,SEPARATED。若linkType参数的值为HEAD_CHAINED,新的委托类将被链接为第一个已注册委托类。若linkType参数的值为REAR_CHAINED,新的委托类将被链接为最后一个已注册委托类。若linkType参数的值为SEPARATED,新的委托类将作为一个独立的委托类存在。

 

若使用委托类实施访问控制,管理员不能直接修改代码来管理角色。然而,如果委托类不能被控制,在管理角色时问题就会出现。因此,本模型提供了setEnable/setDisable方法来激活/不激活委托类。bundleId参数和roleId参数用于指示bundle和角色的ID。rBId参数将被传递到需要被控制的委托类。

 

setEnable(String bundleId,StringroleId, String rbId);

 

setDisable(String bundleId,StringroleId, String rbId);

 

RoleRegsitry由三张Hash表和一个链表组成。第一张Hash表中role ID是其主键,每次往一个角色中注册第一个委托类时,Hash表中将增加一个元组。若一个或多个委托类已经注册,新的委托类将链接至之前已注册委托类的环状链表中。除SEPARATED链接类型外,所有的委托类都应被增加到该环状链表中。第二张Hash表使用bundle ID和role ID共同作为其主键,该Hash表用于在访问控制需要验证时搜索对应角色的委托类。该表包含了三个属性:①用于增加委托类的linkType;②已在角色中注册的委托类的引用;③第一张Hash表中的第一个委托类的引用。最后一张Hash表使用委托类ID作为其主键,用于激活/不激活委托类。

 

如果某bundle停止或被卸载,RoleRegistry中该bundle下所有注册的角色应当被删除。因为局部角色与其他角色是独立的,在bundle停止或卸载事件发生时,局部角色应当立即被删除。但是,全局角色将先确认是否在其他bundle中有注册的委托类,如果有的话,一个临时的角色将被创建和替换。完成替换之后,链接类型为HEAD_CHAINED和REAR_CHAINED的已注册委托类将被通知该角色已被删除。在RoleBehaviour类中,定义了下列lisener方法。

 

public void removedRole(Role r,Bundle b);

 

当某bundle停止或卸载事件发生时,从RoleRegistry中删除角色有如下三种方法:

 

(1)修改bundle生命周期层中处理STOP和UNINSTALL事件的框架源代码;

 

(2)注册一个用于等待和捕获STOP和UNINSTALL事件的监听器;

 

(3)复制一个加入点(joinpoint)到该bundle的Activator类的stop()方法中,然后由AOP处理。

 

第一种方法中,在执行了STOP命令或UPDATE命令,bundle将转换到STOP状态下。它要求在bundle被修改完成前,角色不能被删除。而后面两种方法不能区分STOP和UPDATE状态。因此,在框架的修改命令执行期间bundle停止时,需要修改源代码来阻止RoleRegistry中角色的删除。

 

2.4 访问控制 

模型中有两种访问控制方法:一种使用Authorization类;另一种使用RoleBehaviour类。管理员配置和管理在Authorization类中的全局策略。服务bundle开发者或安全设计者配置和管理在RoleBehaviour类中的局部策略。全局策略比局部策略拥有更高的优先级。如:某用户可能被某局部策略拒绝访问,但仍然被全局策略授权使用服务。算法1描述了全局策略和局部策略的完整的访问控制算法。


算法1

 

算法1中第3步和第4步中的关于第一个委托类和链接的委托类搜索的细节过程在算法2中被描述。每个角色的访问控制逻辑在Authorization类及该委托类中实现,但是整体流程的访问控制是由一个采用AOP模式的授权切面的层进行管理。


算法2

 

图5显示了将AOP模式应用于OSGi平台的授权机制时连接点(Joinpoint)、切入点(Point-cut)和通知(Advice)。当某连接点中指定的类或方法被用户服务请求调用时,授权切面(The Authorization Aspect)将拦截程序的执行并实施其访问控制机制。


图5

 

Java注释机制指明了需要访问控制的连接点[4]。如图6所示,@RequiredPermission注释表示类或方法中该连接点需要访问控制的位置。


图6

 

表1描述了对应于控制范围和角色类型的用于访问控制的注释。当控制范围是一个方法的时候,@RoleTargetParam就是一个对方法参数的注释,该注释参数被传递至用于执行访问控制逻辑的委托类的RoleBehaviour.hasRole方法中。@RoleTargetParam注释如图7所示。


图7

 

授权切面拦截了@RequiredPermission注释的类和方法的执行,并且实施了其授权。

 

即使用了@RequiredPermission注释定义切入点,使用了AuthorizationUtil类定义通知(advice)。AuthorizationUtil类是为授权切面的授权而新建的一个类。图8和图9显示了该切入点和对类和方法进行访问控制的通知。


图8



图9

 

算法3显示了用于访问控制检查的算法。


算法3

 

3.结论

本文在OSGi平台上使用委托模型设计和实现了一种访问控制方法。目前,由于家庭网络中存在不同种类的设备和服务,需要越来越多独立的安装服务。在一个独立的安装环境下,以前的授权机制无法为新的服务提供合适的访问控制机制。本文设计的授权模型建立在已存在的OSGi访问控制模型基础上,能够提供独立安装服务环境下的访问控制能力。通过引入相对角色概念以及使用委托模型激活访问控制,提供了一种多样化的访问控制能力。

 

 

参考文献: 

 

[1] 邢小永.基于RBAC扩展模型的授权策略研究[D].河南郑州:中国人民解放军信息工程大学,2006.

 

[2] 许长枫,何大可,刘爱江.RBAC授权模型及其属性证书实现机制的应用研究[J].计算机应用研究,2004(3).

 

[3] 张波,董康.基于OSGI的智能家庭系统的设计与实现 [J].电子设计工程,2011(07).

 

[4]余冰,赵珂. 基于 zigbee 的智能家居远程控制系统[j]. 电子设计应用.2009(08):5557.

 

[5]danding,rorya.cooper,paulf.pasquina,etal.sensortechnologyforsmarthomes[j].maturitas,2011.69(2):131136.

 

[6] Sun Microsystems.Java 1.5documentation,2007. http://java.sun.com/j2se/1.5.0.