当前位置:首页 > 读后感 > 【通用权限设计方案】 通用权限设计
 

【通用权限设计方案】 通用权限设计

发布时间:2019-01-11 03:58:29 影响了:

  摘要:在现在各种基于Java的信息系统的设计与实现中,用户权限管理是一个不可缺少的模块。目前通常的设计思想是利用像Acegi这样优秀的开源框架提供描述性的安全保护。这里通过一个用户权限管理系统介绍了利用Spring的面向方面特性使权限管理在基于Spring系统中通用的一种实现方案。
  关键词:数据库;Acegi;面向方面编程;切面;角色
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31655-02
  Universal Permission Solution ――Permission Design of B/S System Based on Spring
  ZHONG Liang
  (School of Software Engineering,Tongji University,Shanghai 201804,China)
  Abstract:In the design and implementation of J2EE MIS, pemission management is an indispensable module. The general design is providing declarative security with a good framework such as Acegi. It introduces a solution which makes the pemission authentication module universal in Spring-based system. And it mainly implemented with aspect-oriented programming feature of Spring Framework.
  Key words:Database;Acegi;AOP;Aspect;Role
  
  1 引言
  
  在大多数信息系统中,安全性都是一个非常重要的切面。这里用“切面”这个词,主要是因为安全性是贯穿整个应用系统的关注点。这在AOP(面向方面编程)中一般称之为一个切面,与系统中的其他模块,如日志,事务管理模块同属于系统的切面。介绍的系统也是根据这个理论利用Spring框架的AOP特性和基于数据库的用户权限来实现系统的安全性。
  这里所说的系统安全性,主要是指通过何种手段来确保系统信息的机密性和完整性。主要是认证和授权两种。认证是指确保用户的身份与其声称的一致,最基本也是最常用的认证形式是由用户说明自己的身份再提供只能由该用户生成的信息,也就是常见的用户名和密码。授权是指系统决定用户在通过认证后可进行那些操作。常见的有两种方法,访问控制列表(Access Control Lists)与指派角色和组。
  
  2 AOP和Acegi
  
  AOP是一种编程技术,用于在系统中实现业务的分离。在实际应用中,系统通常由很多组件组成,每个组件负责一部分功能。但是除了完成核心业务的组件之外,系统一般还包括日志、事务和安全等融入到其他功能模块中的服务。本文主要讨论安全服务的设计,所以以Spring的AOP支持作为框架基础的Acegi安全系统是设计的基础。
  Acegi安全系统是是AOP技术在安全模块应用的一个典型框架。它主要包括4大组件来实施安全性:安全拦截器,认证管理器,访问决策管理器和运行身份管理器,如图1所示。
  图1 Acegi框架图
  下面简单介绍一下每个组件在系统中扮演的角色。
  安全拦截器
  所有的安全系统目的都是保证系统的受保护资源不被没有权限的人访问。安全拦截器便是在系统中充当看门人的角色。
  认证管理器
  认证管理器是要通过安全拦截器必须打开的两把“锁”之一。它负责确定访问用户的身份,一般通过用户提供自己的身份(用户名)和凭证(密码)来实现。
  访问决策管理器
  用户通过认证管理器的确认之后,安全拦截器必须决定用户是否拥有访问受保护资源的恰当的权限。这就是访问决策管理器需要完成的事情。
  运行身份管理器
  运行身份管理器用于在获得系统认证和授权以后,在访问相关的其他资源时用预定义的身份替换用户的身份,以便允许用户访问其他相关的资源。
  
  3 系统设计与实现
  
  本管理系统实际上是一个组件,完成一般J2EE系统所需的用户和权限管理功能。面向的主要是应用系统的设计者和程序员,而最终用户也可以使用该权限系统提供的管理功能。具体到整个权限系统内部,主要分为用户管理(包括组管理)和角色管理(访问控制)。
  用户管理主要完成的功能是用户和用户组信息的存储、维护以及用户身份验证。用户隶属于某个组,组和组之间可以相互有父子关系。
  角色管理主要完成的功能是用户角色的创建、维护和角色权限的管理。角色可以赋给用户或者用户组,角色拥有权限。由于权限的设定涉及很多业务逻辑和组件,因此由系统设计者和开发人员在设计和开发阶段确定各种系统资源的访问权限。
  跟大多数应用系统一样,用户和角色的管理通过关系数据库的表和相互之间的关系来表示。主要包含USER_INFO,USER_GROUP,USER_ROLE,USERGROUP_ROLE,ROLES和PERMISSIONS等六个表。USER_INFO和USER_GROUP两个表分别存储用户和用户组的信息。PERMISSIONS表用于存储系统各项资源的访问权限,包括的信息有权限代码、描述和系统资源。这里的系统资源用字符串表示,典型的有Java类,访问的URI等,例如permission.admin.RoleAction和product/addProduct.jsp。ROLES表存储了整个系统所有的角色的信息,包括角色名称、拥有的权限。在数据库中,角色拥有的权限用PERMISSIONS表中权限的代码的组合来表示。比如有以下三种权限:
  101 角色管理 permission.admin.RoleAction
  102 角色页面访问 permission.admin.RoleManager
  103 用户页面访问 permission.admin.UserManager
  则ROLES表中表示系统管理员角色的权限的字符串就是“101,102,103”。
  USER_ROLE和USERGROUP_ROLE表中存储的就是用户和角色、用户组和角色的对应关系。详细的数据库结构和关系参见图2。
  图2 数据库结构和相互关系
  除了数据库的设计之外,权限系统的整体结构也是实现这个系统的关键。整个系统的权限控制主要采用了Servlet Filter和Spring的AOP思想。所有的关键在Spring的配置文件中。
  系统支持三种权限验证方案。第一种是以URI作为权限代码分配的资源,第二种是以类名作为权限代码分配的资源,第三种是以方法名作为权限分配的资源。在此只介绍各种方法的主要设计思想。
  第一种方法采用Servlet过滤器来拦截对应用系统的请求,并且在应用系统真正处理请求之前进行某些安全处理。主要实现步骤如下:
  (1)首先需要为目标系统配置过滤器UriACFilter,该过滤器用来在处理请求之前验证用户的权限是否满足。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文   (2)_实现ResourceToPermission接口的String getPermission(String resource)方法,该接口用于通过当前请求的URI(由参数resource提供)来取得该资源的权限代码。具体见前面关于PERMISSIONS数据表的描述。
  (3)修改spring-acs-core.xml文件中关于ResourceToPermission接口实现bean的定义。
  (4)定义数据库表PERMISSIONS的记录。
  第二和第三种方法,用到了Spring的切入点和通知(环绕通知)的概念。因此要使用这两种方法,要求系统的逻辑层代码使用aop技术。即是业务逻辑bean应该由容器管理(如系统默认的容器spring),在容器中配置拦截器应用切面。主要实现步骤有两步:
  (1)首先自定义拦截器实现aopalliance的MethodInterceptor接口,在拦截器中对用户的权限进行验证,比如用户是否有权访问类或方法;然后用Spring中的正则表达式切入点将自定义的拦截器和切入点组合到一个Spring bean中,同时定义切入点的正则表达式“patterns”,以决定何时应用切面。
  (2)首先配置业务逻辑bean,然后以该bean为参数配置targetSource,最后用Spring的ProxyFactoryBean配置该业务逻辑bean的代理。此步骤由使用本权限系统的开发人员在目标系统中配置,这种做法也是为了实现本权限系统的通用性。
  (3)定义数据库表PERMISSIONS的记录,资源为类的全限定名或者全限定名.方法名。例如,permission.admin.RoleAction和permission.admin.RoleAction.delete。
  以类名和方法名分配权限的方法比较复杂,下面简单描述一下Spring配置文件的配置情况。
  (1)配置拦截器:
  以类名分配权限:
  
  
  以方法名分配权限:
  
  
  (2)配置Spring的切入点:
  
  
  
  
  
  
  .*getAll.*
  .*add.*
  ……
  
  
  
  用户可以使用含有getAll,add,delete,update,……等的任意方法名来配置属性patterns。
  (3)配置逻辑bean。
  此处配置的逻辑bean是本系统用来进行用户和权限管理的bean,在目标系统的配置文件中定义。以permission.admin.RoleAction为例配置如下:
  配置bean:
  
  
  配置TargetSource:
  
  
  roleActionSpring
  
  
  配置代理:
  
  
  
  
  
  
  permissionAdvisor
  
  
  
  
  4 总结
  
  本用户和权限管理系统在设计的时候以通用性作为目标,在使用Spring作为系统基础的前提下,很大程度上实现了通用。用户在使用该系统的时候,只需在自己的系统中加入库文件和一些配置文件就可以使用该用户权限管理系统。而且用户可以很方便的决定是否使用该系统中的用户管理部分。当目标系统非常庞大的时候,权限验证的效率是有待改进的部分。
  由于篇幅所限,这里只介绍了系统的数据库设计和权限设计部分的核心思想与实现。
  
  参考文献:
  [1]Craig Walls.李磊,程立,周悦虹.译.Ryan Breidenbach.Spring in Action[M].人民邮电出版社,2006.
  [2]Christopher Steel,Ramesh Nagappan,Ray Lai. 陈秋萍,罗邓,袁国忠.译.安全模式-J2EE、Web服务和身份管理最佳实践与策略[M].机械工业出版社,2006.
  [3]罗时飞.敏捷ACEGI、CAS--构建安全的JAVA系统[M].电子工业出版社,2007.
  [4]Renaud Pawlak,Jean-Philippe Retaillé,Lionel Seinturier.Foundations of AOP for J2EE Development[M].Apress,2005.
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3