1、1 引言基于角色访问控制( role - based access control,RBAC) 是目前较为成熟的安全访问控制模型,它灵活地解决了权限管理、资源管理及权限审查问题,非常适合基于 Web 的信息系统。RBAC 模型从理论上基本解决了系统用户访问控制的问题,但从技术实现的角度来看,不同的 RBAC 实现,对系统的开发及运行效率将有不同影响。本文结合 Struts 框架良好的 MVC 设计模式和 RBAC 灵活的权限管理的特点,提出一个基于 Struts 框架的 RBAC的实现方案。方案较好地实现了 RBAC 模型,并实现了业务层与逻辑层的分离,具有较好的应用效果。2 RBAC 的基本
2、原理RBAC 模型引入了“ 角色 ”的概念。所谓“角色”就是一个或一群用户在系统中可执行的操作的集合,它是一个用户的集合,又是一个授权许可的集合。通过将角色指派给用户,为角色赋予权限的方式,使用户和权限通过角色间接相联系。RBAC 基本模型如图1所示。图1 RBAC 基本模型在 RBAC 中,用户与角色之间、角色与权限之间都是多对多的关系。会话是一个用户对多个角色的映射,此时的用户权限可以为激活角色权限的并集。RBAC 对资源授权管理过程分为两个部分,首先实现访问权限与角色相关联,然后再实现角色与用户相关联,从而实现了用户与访问权限的逻辑分离。3 Struts 简介传统的以 JSP 页面为核心
3、的开发模式由于表示逻辑和业务逻辑的强耦合,不利于应用扩展和更新,已不能满足应用规模的进一步扩大的需求。MVC 设计模式将应用程序分为三个核心部分:模型、视图、控制器,它们各自处理各自的事务,很好地实现表示逻辑和业务逻辑的有机分离。Struts 是 MVC 设计模式的一种实现框架,包含了丰富的标记库和独立于该框架工作的实用程序类,近年来被越来越多地运用于很多大型系统的实现,成为 Web应用开发中最为流行的框架之一。简单的 Struts 体系结构如图 2所示。客户端通过浏览器发出请求后,请求被 ActionServlet 获得, ActionServlet 在 Struts-config.xml
4、配置文件中查找有效映射,然后将相应的 ActionMapping 对象转发给 Action 处理器对象进行处理。Action 处理器对象访问 ActionForm 中的数据,处理和响应客户的请求,它还调用后台的 Bean 组件,这些组件封装了具体的业务逻辑。Action 处理器对象根据处理结果通知控制器,控制器进行下一步的处理。图2 Struts 体系结构4 基于 Struts 框架的 RBAC 的实现在基于 Struts 的信息系统中, “权限” 体现为是否拥有对某功能模块的访问资格。当用户需要完成某种功能时,通常都是以发出类似*.do 形式的 URL 来请求。所以,验证的任务就是验证用户是
5、否拥有权限访问 URL 所指的功能模块。在以往的基于 Struts 框架的 RBAC 实现中,基本思想都和上述一致,但就各自的实现方式而言,又各有优缺点。比如,有的实现方式是在每个 Action 中添加权限验证,这种方式实现简单,但由于权限审查过于分散,导致系统可维护性以及可移植性较差;有的是将URL 资源及对应权限关系保存在数据库中,根据用户的角色权限信息进行比对来实施权限审查,这种实现方法灵活,易维护,但每次进行权限审查时必然增加了数据库的访问次数,而且,有时可能多个请求(如新增、保存、删除等 )通过同一个 Action 转发,使用这种方式就需要慎重考虑 URL 粒度是否太粗的问题。通过对
6、比分析,笔者提出一种新的基于 Struts 的 RBAC 的实现。基本原理也是验证用户 URL 请求的合法性,但具体实现时,考虑了以下几个方面的设计: RBAC 中用户、角色和权限关系的存储设计。 用户的 URL 请求的设计。 struts-config.xml 的设计。 权限的验证算法的设计。4.1 数据库设计RBAC 中用户、角色和权限关系应该存储在数据库中。在实施验证时,可以根据发出请求的用户(通常在用户登录时由系统保存 )查找其角色和权限信息。数据库中需要以下几个表:(1) 用户表:OA_USERid,Sys_Name,Password, other user infomation。(
7、2) 角色表:OA_ROLEid ,Role_Name,other role infomation。(3) 权限表:OA_POWERid,Power_Name ,other power information。(4) 用户角色表:OA_USER_ROLEid ,User_id,Role_id。(5) 角色权限表:OA_ROLE_POWERid ,Role_id,Power_id 。我们不采用将 URL 资源及对应权限关系存放于数据库的方式,以减少权限审查时数据库访问次数。4.2 URL 请求的设计考虑到可能有多种操作请求通过同一个 Action 转发,我们规定在 URL 中添加请求参数,以表明
8、它所指向的 Action 以及操作形式。具体形式可以这样:*.do?actionType=ProjectDelete,其中 actionType 参数的值即表明了操作形式。对于针对相同 Action 的请求,由于可以使用 actionType 参数加以区分,因此这种方式可以解决 URL粒度太粗的问题。4.3 struts-config.xml 的设计由于 URL 资源与权限的映射关系没有存放于数据库,而这种映射关系又是权限审查时的重要依据,因此必须解决映射关系的存储问题。通过分析,我们发现,之所以需要知道URL 与权限的映射关系,本质上是为了反映这样一个问题:每个 Action 都需要知道它的
9、actionType 与哪一个权限对应。也就是说,如果我们让 Action 知道了它的 actionType 所对应的权限也就解决了 URL 资源与权限的映射关系。为实现上述目标,struts-config.xml 需要做如下配置:配置 Action 时,对于需要进行权限审查的 Action,可以配置其 Parameter 属性,以“actionType(Power_Name)”形式保存 actionType 与权限的映射关系,多个 actionType 与权限的映射可以用分号作为分隔。当请求指向 Action 时,可以获取并分析 Parameter 参数值,用以完成权限审查。4.4 权限验证
10、算法的设计首先,既然系统中大部分的 Action 都需要进行形式相似的权限验证,其中必然存在可复用的设计。结合面向对象的思想,我们可以设计一个基类 Action,不妨取名为BaseAction,在该 Action 中封装权限审查逻辑,系统中所有需要进行权限审查的 Action,都可以从该类继承,由此天生具有了权限审查能力。这样,我们就实现了权限审查逻辑的集中管理,便于系统的维护。BaseAction 类设计如下:public abstract class BaseAction extends Actionpublic ActionForward execute(ActionMapping ma
11、pping, ActionForm form,HttpServletRequest request, HttpServlet Response response) if(checkPower(request,mapping)ActionForward forward=doExecute(mapping,form,request ,response) ;return forward;elsereturn mapping.findForward(“nopower“);public abstract ActionForward doExecute(ActionMapping mapping,Acti
12、onForm form,HttpServletRequest request, HttpServletResponse response);/要求所有BaseAction 的子类必须实现该方法,供 Excute 方法调用private String getActionPower(ActionMapping mapping)/根据 request 传递的 paramter 值,在配置文件中查找对应权限名称并返回String actionType=request.getParameter (“action Type“);String parameter=mapping.getParameter()
13、;private boolean checkPower(HttpServletRequest request,ActionMapping mapping )/权限审查/ 获取登录用户信息LoginUser loginUser=(LoginUser)session.getAttribute(“currentUser“);/ 获取此次操作所需的权限String needPower=getActionPower(mapping);/ 验证登录用户是否拥有操作权限if(IsPowerInUserRole(needPower,loginUser)return true;elsereturn false;
14、private boolean IsPowerInUserPower(String needPower,LoginUser loginUser)/判断登录用户 loginUser 拥有的权限集合是否包含 needPower 权限5 结束语RBAC 是目前较为成熟的安全访问控制模型,Struts 是目前较为流行基于 MVC 的 Web系统开发框架,将两者结合起来开发 Web 信息系统,将大大提高系统的安全性,同时系统也将具有开发效率高、易维护等良好特性。参考文献1 丁振国,吴环宇.RBAC 在管理信息系统中的应用J.微计算机信息(管控一体化) ,2007,23(6-3) , 4-62 孙卫琴. 精通 Struts: 基于 MVC 的 JavaWeb 设计与开发M. 北京: 电子工业出版社,20043 杨丽娜,魏永红.基于 struts 技术的 Web 应用设计与实现J. 计算机与信息技术,2006,8,35-36