熊海东,徐 德,潘 刚,彭智勇(.四川幼儿师范高等专科学校教务处,四川绵阳6700;.中国人民银行乌鲁木齐中心支行,新疆乌鲁木齐8000;.四川文理学院计算机学院,四川达州65000;.凯里学院组织部,贵州凯里5560)
一种浏览器端RBAC模型
熊海东1,徐德2,潘刚3,彭智勇4
(1.四川幼儿师范高等专科学校教务处,四川绵阳621700;2.中国人民银行乌鲁木齐中心支行,新疆乌鲁木齐832000;3.四川文理学院计算机学院,四川达州635000;4.凯里学院组织部,贵州凯里556011)
实现基于角色访问控制(RBAC)是B/S或C/S系统安全的必要条件,在服务端实现RBAC有成熟的方案,而浏览器端尚没有标准方案.为实现浏览器端的RBAC,在常用JavaScript框架ExtJS基础上,提出模块和操作栏的概念,设计了浏览器端的RBAC模型,使用服务器端的RBAC数据实现了浏览器端的RBAC.在实际项目开发中使用该模型,不仅使系统浏览器端实现了RBAC,而且为浏览器端开发提供了一个开发标准和规范,更有助于提高开发效率及系统源代码的规范.
RBAC模型;浏览器端;ExtJS;Spring Security;题库
Xiong HD,Xu D,Pan G,etal.Role-Based Access Control(RBAC)Modelon the Browser Side[J].Journal of Yibin Uni⁃versity,2015,15(6):66-69.
随着计算机B/S系统的广泛应用,客户对系统安全性和用户体验提出了更高的要求,系统安全的一个必要条件就是实现基于角色访问控制(Role-Based Access Control,RBAC).在服务器端,实现RBAC比较容易,模型方面有RBAC96模型、AR⁃BAC97模型、DRABC模型等,在这些模型的基础上出现了许多非常优秀的开源框架,像Spring Security Framework、Shiro等.但在浏览器端缺乏标准和规范,这也是基于浏览器的动态语言JavaScript特性所造成的JavaScript框架众多,很难有统一的实现标准.为了更好地实现RBAC,很多学者提出服务器端和浏览器端共同协作权限控制方法[1],其特点是:用户操作时,浏览器端首先做的是简单权限检验,浏览器端检验通过以后服务器端再做最终权限检验.由于浏览器端的检验非常简单,这种方法在浏览器端没有真正实现RBAC,而是将所有的操作直接暴露给用户,当用户操作被服务端拒绝后,浏览器端提示用户无法进行该操作,这样不但降低了用户体验而且存在安全隐患.浏览器端实现RBAC的最佳效果是浏览器端对用户有权限的内容进行加载并显示,而对无权限的内容则不加载不显示,根据用户权限动态的显示界面,实现“所见即所得”的效果.
设计的浏览器端模型依赖服务器端的RBAC模型,服务器端可使用常见的细粒度权限管理框架,如Spring Security Framework、Shiro等,也可自行设计.浏览器端可以通过常见的JavaScript框架来实现,如ExtJS、JQuery UI等.本文以Spring Security Frame⁃work和ExtJS为例来实现这个模型;在模型中,浏览器端和服务器端是依赖关系,浏览器端使用服务器端提供的动态数据来初始化浏览器端的视图.
1.1浏览器端的一些定义
在浏览器端提出“模块”“操作面板”“操作栏”“操作”的概念.模块(图1的1部分),是针对某一项业务的,如“试题管理”“系统管理”等,一般使用TreePanel和Tree来表示.用户选择某个模块,则会出现相应的操作面板(图1的2、3部分一起构成操作面板),操作面板是用户进行真正操作的地方,用户可以选择某条数据进行某种操作,操作面板一般使用GridPanel[2].操作栏(图1的2部分)是操作面板的一部分,用户选择某条数据以后就可以在操作栏选择相应的操作,一般使用ToolBar.操作栏由很多操作组成,操作使用Button表示.在这个4个概念中,不同权限的用户,其拥有的模块和操作是不同的,实现浏览器端RBAC的关键是如何动态地初始化模块和操作.
图1 浏览器界面示意图
1.2服务器端数据表结构
浏览器端的RBAC的实现依赖于服务器端的数据,浏览器端使用该数据初始化模块和操作.由于本文模型是细粒度的RBAC的实现,所以不仅要对浏览器端的模块实现RBAC,而且对于每个模块上的操作也要实现RBAC.模型所涉及的数据表如表1所示.
表1 核心数据表结构说明
其中涉及角色数据表如图2所示.
图2 涉及角色数据表结构
各表之间的关联关系分为两种:一对多和多对多.模块表和操作表是一对多的关系,在操作表里有一外键属性,用于存储操作对应的模块.角色与模块、操作是多对多的关系,所以通过中间表(图2)“角色模块表”和“角色操作表”来实现.按照这样的数据库设计,并在表信息中加入浏览器端部分相关信息,就可以同时在服务器端通过Shiro或Spring Se⁃curity实现RBAC,这样服务器端就能根据不同用户的权限动态为浏览器端提供模块和操作的数据.
1.3浏览器端模型
浏览器端模型的关键是如何利用登陆成功后服务器端返回的数据初始化浏览器界面.在“模块”和“操作”概念里,“模块”对应TreePanel和TreeNode,“操作”对应ToolBar的Button,初始化浏览器端也就是初始化TreePanel、TreeNode、ToolBar、Button等控件.初始化这些控件需要JSON[3]格式的数据,初始化“模块”和“操作”所用到的JSON格式数据分别与表1中的模块表和操作表对应.数据转化流程为模块表、操作表——Java POJO对象——JSON数据——ExtJS的TreePanel、TreeNode、ToolBar、Button控件等.
JSON格式数据是初始化ExtJS控件的关键,在服务器端需要对Java POJO对象作适当的处理才能形成符合初始化ExtJS控件的JSON数据.模块数据的JSON格式如下所示:
{
"id":3,
"chinese":"系统根模块",
"iconClz":"root",
"orderNum":1,
"status":2,
"parent":1
}
id表示该模块记录在数据库中的主键,chinese表示该模块的中文名称,iconClz表示该模块使用图标的英文名称,orderNum表示该模块在同类中的顺序,status表示模块的状态,parent为该模块的父模块的主键.
操作数据的JSON格式如下:
{
"id":11,
"chinese":"创建",
"iconClz":"create",
"orderNum":1,
"status":0,
"moduleId":51
}
id表示该操作记录在数据库中的主键,chinese表示该操作的中文名称,iconClz表示该操作使用图标的英文名称,orderNum表示该图标在ToolBar中的顺序,status表示操作的可用与否,moduleId是该操作所属模块的主键,用于确定操作属于哪个模块.
这样的数据结构设计既适合关系型数据库的存储,也适合浏览器端初始化TreePanel、TreeNode和ToolBar.
2.1工作流程
本模型的工作流程根据用户的操作分为登录和选择模块两个部分,根据处理地点分为浏览器端和服务器端,如图3所示.用户进行登录操作,此时浏览器端发出登录请求,服务端在接收到登录请求后首先检查用户的合法性,如果用户不合法则向浏览器端返回错误信息,如果用户合法则获取用户所拥有的角色对应的模块和操作数据并将其返回给浏览器端.浏览器端在接收到服务器的响应以后,如果是错误信息则直接在页面上显示错误信息,如果是正确信息,则提取并保存模块和操作数据,接着浏览器发生跳转,进入管理界面,用保存的模块和操作数据来初始化管理界面.选择模块,用户在浏览器端选择某一模块,浏览器向服务端发出获取文本的Ajax请求[4],服务器端在收到浏览器端的请求以后返回该模块对应的JavaScirpt文本,浏览器利用该文本通过eval将文本加入到JavaScript运行环境中,接着浏览器端初始化图1中的2部分和3部分,即ToolBar和操作面板,其中初始化ToolBar的数据是登录后的浏览器端保存的操作数据.
图3 模型工作流程图
2.2初始化模块和操作的核心函数
在浏览器端获得了模块和操作的数据后,难点是如何将数据高效地转换为JavaScript对象.因为有树结构的存在,初始化模块和操作的函数主要通过遍历和递归来完成.核心代码如下所示:
function initBrowser(json)
{∥json为用户登录后返回的数据
var coms=json.data;
var userModule=$.makeArray(coms.userModule);∥获取模块
userCommand=$.makeArray(coms.userCommand);∥获取操作
var_showModule=[];
$.each(userModule,getShowModule);∥获取需要显示的模块
showModule=objArrayUnique(_showModule,"id");∥去除重复的模块
new layout.viewport(showModule);∥完成显示
function getShowModule(n,v)
{
while(v!=null)
{
_showModule.push(v);
v=v.parent;
}
}
}
initBrowser函数通过闭包、循环遍历完成了图1 的1部分模块树的初始化.json变量为用户登录后返回的数据,其中json.data为模块和操作的数据.json不是JavaScript中的数组,需要通过$.makeArray函数将json转换成数组.coms.userModule是模块数据,是从操作中提取的,由于模块与操作是一对多的关系,所以从操作中提取的模块是有重复的,需要通过自定义的objArrayUnique函数来去重.
在实际开发中应用此模型简单方便,使用过程如下:
1)在Web工程中引入通用JavaScript文件.这些文件主要分两类:一类是通用函数的JavaScript文件,包括该模型里用到的通用函数、初始化模块和操作的核心函数、生成并初始化ExtJS的ToolBar控件的函数、生成并初始化ExtJS的Combox控件的函数;另一类是Web系统常用模块的JavaScript文件,如“系统管理”“用户管理”“权限管理”等.
2)添加服务器端数据库的数据表.该过程通过运行数据库初始化脚本完成,数据库初始化脚本包含了模型全部用到的数据表,主要为表1中所列举的数据表,另外初始化过程也会往数据库追加一些基础的数据记录,例如Web系统常用的模块和操作的数据.
3)往数据库的模块及操作表增加开发中的模块、操作具体信息[5].信息包括模块信息和全部操作信息,对应表1中的“模块表”和“操作表”.由于模块之间、模块与操作之间存在一对多的关系,所以,在创建模块和操作的时候必须指定模块和操作属于哪个模块.添加模块如图4所示.
图4 新增模块示意图
4)编写浏览器端JavaScript代码,按照模型的代码规范编写浏览器端的JavaScript代码.代码规范是模型的一部分,没有统一的代码规范,就无法实现真正的浏览器端的RBAC.代码规范虽然在一定程度上约束了开发者,但是在开发者熟练掌握代码规范以后也可以实现快速开发,同时后期维护人员在掌握代码规范以后也可以进行代码维护.
5)为角色分配模块的操作权限.如图5所示,当前选中的角色拥有“题库管理”模块,该模块拥有子模块“课程管理”,并且当前的角色拥有“课程管理”的“创建”和“删除”操作.用户可通过勾选和取消勾选来完成权限管理.
图5 为角色分配权限示意图
本文提出浏览器端模型有以下优点:第一,通过模型可以在浏览器端实现RBAC模型,在浏览器端就杜绝了用户的非法操作,提高了系统的安全性,给用户“所见即所得”的用户体验;第二,使用该模型能简化、规范浏览器端代码的开发,浏览器端开发工程师可以借助该模型快速进行操作界面的编码,同时代码也得到规范统一,有助于后续的代码维护工作.同时模型存在以下需改进的地方:界面初始化核心函数需改进性能,由于界面层使用到树控件,所以在初始化过程中使用到递归,随着树的数据增加,递归的时间会变长,加上网速的影响,浏览器端的初始化可能会很慢;可移植性有待提高,模型目前只能应用在ExtJS上,除了ExtJS还有其他主流JavaScript库如jQuery UI、Dojo等没有试验,需要继续改进模型的通用性,使其框架能被简单地移植到其他JavaS⁃crip库;实际使用中步骤过多,初学者不易将模型集成到自己的Web工程中,需要简化合并使用过程,改进模型的集成性.
[1] 吴波,王晶.基于基本RBAC模型的权限管理框架的设计与实现[J].计算机系统应用,2011(4):32-36.
[2] 张鹏伟,陈景霞,张文平,等.基于ExtJS和SSH的Web应用架构的研究与实现[J].陕西科技大学学报(自然科学版),2010(6):15-19.
[3]高静.JSON序列化机制与传输效率研究[D].济南:山东师范大学,2011.
[4]熊海东,陈亚军,潘刚.基于Ajax的动态JavaScript文件加载模型[J].西昌学院学报(自然科学版),2011(3):52-54.
[5]刘强,王磊,何琳.RBAC模型研究历程中的系列问题分析[J].计算机科学,2012(11):12-16.
(编校:李青)
Role-Based Access Control(RBAC)Modelon the Brow ser Side
XIONGHaidong1,XUDe2,PANGang3,PENG Zhiyong4
(1.Teaching Affairs Department,Sichuan Preschool EducatorsCollege,Mianyang,Sichuan 621700,China;2.WulumuqiCentral Subbranch of the People's Bank ofChina,Wulumuqi,Xinjiang 832000,China;3.Department ofComputer,Sichuan University ofArtsand Science,Dazhou,Sichuan 635000,China;4.Organization Department,KailiUniversity,KaiLi,Guizhou 556011,China)
Achieving Role-Based Access Control(RBAC)is one necessary condition for a B/Sor C/S system's security.On the server side,implementation of RBAC hasmature programs,while no standard solution is yet provided for the browser side.To achieve RBAC on the browser side,based on ExtJS framework,the conceptofmodules and action bar was proved,and the RBACmodelon the browser sidewas designed.Themodeluses data from the server side to achieve the RBAC of the browser side.The application of themodel in the actual project not only achieved the RBAC on the browser side,butalso provided standardsand norms for the developmentof the browser side.It improves the development efficiency and the specification ofsystem source code.
RBACmodel;browser side;ExtJS;Spring Security;item bank
TP311
A
1671-5365(2015)06-0066-04
2014-09-01修回:2014-10-15
四川幼儿师范高等专科学校校级重点课题(SCYZZD201201)
熊海东(1986-),男,助教,硕士研究生,研究方向为JavaWeb、大数据
网络出版时间:2014-10-30 14:43网络出版地址:http://www.cnki.net/kcms/detail/51.1630.Z.20141030.1443.001.html
引用格式:熊海东,徐德,潘刚,等.一种浏览器端RBAC模型[J].宜宾学院学报,2015,15(6):66-69.