一种扩展型RBAC电力交易系统权限模型设计与实现
2018-03-19孙恒一
◆孙恒一
一种扩展型RBAC电力交易系统权限模型设计与实现
◆孙恒一
(昆明电力交易中心有限责任公司 云南 650011)
基于角色的访问控制(Role-Based Access Control,RBAC)是广泛使用的系统权限访问控制模型。本文设计并实现了一种扩展型RBAC电力交易系统权限模型,采用“资源-权限-角色-用户-组织”模式的设计,在角色权限的基础上引入用户的正向和负向权限,并利用开源安全框架Shiro,在云南电力交易系统实现了基于RBAC和用户授权的细粒度权限控制,满足了系统针对多种类别市场参与者灵活的权限控制需求。
扩展型RBAC;电力交易系统权限模型;Shiro
0 引言
云南电力交易系统作为承载云南省电力市场化交易业务的系统支撑平台,系统用户范围涵盖发电企业、用电企业、电力交易中心、政府监管机构、电网公司及其下属供电单位、售电公司等市场参与类型。由于系统中的交易申报和成交结果等数据涉及各市场参与者的敏感信息,同时为了满足业务划分的要求,电力交易系统需实现细粒度的权限访问控制[1]。
基于角色的访问控制(Role-Based Access Control,RBAC)是广泛使用的系统权限访问控制模型。在实际中,角色通常根据某项工作或职责来创建,RBAC极大简化了系统权限管理[2]。然而在程序代码中,直接在操作前使用角色名称来进行访问控制的方法缺少权限配置的灵活性和扩展性,也增加了代码变更的频繁程度以及代码维护的复杂程度。
1 云南电力交易系统权限需求
由于云南电力交易系统的用户范围涵盖多种类型市场参与者,在电力交易中心内部又按照业务划分不同的业务部门,因此需要多种类型的系统用户。通过控制不同类型用户对不同功能或数据的访问实现细粒度的权限控制。
1.1权限划分原则
云南电力交易系统的权限划分遵循“最小权限”原则,确保系统针对不同用户具备相应合理规范的功能操作范围和数据可视范围,以保证市场运行的规范性和交易主体数据的安全性。严格限制核心明细数据的查询权限,交易主体只能查询自身核心明细数据,交易中心与政府监管部门以实际工作需要为原则配置核心明细数据的查询权限。
1.2权限设计需求
按照权限划分总体原则,表1列举了云南电力交易系统部分主要功能的权限划分需求,权限类别分为:具有全局操作和查询权限、具有自身数据的操作和查询权限、具有全局查询权限、具有自身数据查询权限、不具有权限。操作权限在实现时又可包含新增、修改等不同的操作,在功能上主要体现为申报、申请、审核等功能或流程。
表1 云南电力交易系统部分主要功能的权限划分需求表
2 扩展RBAC的权限模型设计
参照云南电力交易系统的权限设计需求,下文采用“资源-权限-角色-用户-组织”模式,设计一种扩展型RBAC权限模型。
2.1基于角色的访问控制
在RBAC模型中,系统权限与角色关联,用户被赋予适当的角色而得到相应角色的权限,角色实际上为一组权限的集合,一个角色对应多个用户,一个用户可以拥有多个角色。
2.2扩展RBAC模型设计
基于角色的访问控制为系统用户权限管理提供了一个有效的抽象层次。在实际系统使用过程中,角色一旦创建并分配给多个用户之后,角色中的权限组合一般不会增减。为了满足电力交易系统更加灵活的权限配置需求,适应业务管理的变化,本文对RBAC进行了以下扩展设计。
(1)基于资源的权限定义。资源是指在应用中用户可以访问的数据、对象、页面、查看、编辑操作等任何对象,权限则代表用户可以访问某个资源的权利,用户在授权后才能访问资源。此处,资源的概念已包含了数据和操作,通过这种定义将权限进行了统一设计。
(2)引入用户的负向和正向权限。在用户所获得角色权限的基础上,减去负向权限,增加正向权限,最终构成用户所拥有权限的组合。因此,用户的负向和正向权限优先级将大于角色权限。在实际应用中,由于业务要求需要对某些用户进行特殊的权限控制时,即可配置用户负向和正向权限。
(3)通过增加用户与组织的关系设置用户默认角色。一般情况下,一个组织下的用户具有一些相同的权限,将某些特定的角色与组织相关联,作为该组织下新增用户的默认角色。
基于以上扩展,设计了云南电力交易系统的权限模型。其中数据结构的设计如图1所示。
图1系统权限模型数据结构设计图
3 扩展RBAC的权限模型实现
基于上述扩展RBAC权限模型设计,采用开源的安全框架Shiro进行了实现。
3.1 Shiro:一种Java安全框架
Apache Shiro是Java的一个开源的安全框架,主要包含了身份认证(Authentication)、授权(Authorization)、会话管理(Session Manager)、加密(Cryptography)等功能,基于Shiro框架可以很容易的在应用中实现权限控制模型。Shiro的工作机制如图2所示,主要包含以下核心部分:
图2 Shiro核心框架和概念图
(1)主体(Subject):代表了当前与应用交互的“用户”,可以是一个具体的人,也可以是一个应用服务、自动程序等,是一个抽象概念。
(2)安全管理器(SecurityManager):即所有与安全有关的操作都会与安全管理器交互;且它管理着所有主体,与主体的所有交互都会委托给安全管理器进行执行。
(3)域(Realm):Shiro从域获取安全数据(如用户、角色、权限),以判断用户身份和授权,可以把域看成Shiro的安全数据源。
在一个简单的Shiro应用中,应用代码通过主体来进行认证和授权,而主体又委托给安全管理器进行执行;Shiro将域的数据注入到安全管理器中,从而可以对合法的用户及其权限进行判断。具体授权流程如图3所示:
图3 Shiro授权流程图
(1)首先调用Subject.isPermitted*/hasRole*接口,传入需要判断的权限或角色,其会委托给SecurityManager,而SecurityManager接着会委托给Authorizer;
(2)Authorizer是真正的授权者,会将传入的字符解析为角色/权限实例;
(3)在进行授权之前,其会调用相应的Realm获取Subject相应的角色/权限用于匹配传入的角色/权限;
(4)Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给ModularRealmAuthorizer进行循环判断。
Shiro支持多种形式的Realm定义,可采用配置文件、jdbc或自定义Realm类的形式实现Realm。因此,通过在应用中重新实现Realm类,就可实现本文设计的权限控制模型。
3.2 基于Shiro的扩展RBAC权限模型实现
基于Shiro框架对上述的扩展RBAC权限模型进行了实现。在集成Shiro框架的基础上,主要实现以下内容:
(1)实现如图1所示的数据库表结构,存储用户、角色、权限以及它们之间的关系。
(2)采用“模块、功能、操作”三元组的方式统一定义一个权限,权限标识符采用字符串“模块名称:功能名称:操作名称”,用“:”分割名称,例如“system:user:update”表示系统用户的修改权限。同时,采用通配符“*”替换某个位置的名称来表示一组功能或一组操作;在权限标识符前增加“+/-”表示用户的正向和负向权限。
(3)实现自定义Realm类,从数据库表获取权限标识符并解析为权限的实例。
(4)在程序代码中使用Shiro的方法实现认证和授权机制。
4 总结
本文结合云南电力交易业务的需求,设计并实现了一种扩展型RBAC电力交易系统权限模型,并基于Shiro框架进行了实现,既简化了开发,又满足了系统针对细粒度权限的灵活控制。
[1]昆明电力交易中心有限责任公司编著.电力市场:云南电力市场建设经验与探索[S].北京:中国电力出版社, 2017.
[2]GB/T 25062-2010.信息安全技术鉴别与授权基于角色的访问控制[S].北京:中国标准出版社, 2010.