一. 概述
几乎在所有的系统中对于权限控制都有直接的需求,而这类需求往往有其相似性,综合常见的对于权限系统的需求构成了本文档,文档主要从功能复用以及模型复用的角度来对权限系统进行总结,以便在各种系统中可对照此篇文档来进行权限系统的实现,考虑到文档的关注点在复用度,在文档中不会过多的去描述功能点到模型产生的过程,而是采用直接通过产生的模型来说明基于此模型如何实现功能点的需求。
二. 功能复用
功能复用相当于此权限模型适合的上下文场景,此权限模型在功能点方面的考虑主要有以下三个方面:
n 基于角色的用户安全管理
系统权限以角色为基础,即以角色来进行权限的分配以及授予,角色分配给用户以使用户可获取相应的权限,角色通过授予权限来获得该角色所对应拥有的权限。
角色的权限可继承,即子角色自动继承父角色的权限。
权限的包含与排斥,包含举例来说就是权限A可包含权限B,体现出来即为拥有权限A即自动拥有了权限B,而排斥举例来说就是角色不可同时拥有权限A和权限B。
n 系统资源(功能模块)操作的控制
系统资源操作的控制在系统上主要分为两个方面:
l 正常途径系统资源操作的控制
体现在实际的需求上通常是菜单、按钮、链接根据用户所在角色的权限的可见性。
l 非法途径系统资源操作的控制
体现在实际的需求上是防止通过非法的URL或命令等方式对系统受保护的系统资源进行操作。
n 数据资源操作的控制
数据资源操作的控制在系统中实际的体现通常是用户只能访问相应数据资源操作权限范围内的数据,如在一个站点中有栏目A、B、C,用户M只拥有对A的访问权限以及对B的管理权限,那么在用户M访问系统时站点中应该只列出栏目A和栏目B,同时在栏目B上拥有相应的管理按钮或链接。
数据资源也需要支持权限继承的模式,即当数据资源本身构成了需要继承的父子关系时,子自动拥有父的所有权限,举例来说就是站点和栏目,栏目自动拥有站点的所有权限。
数据资源的权限也是需要有包含和排斥的支持。
数据资源操作权限的授予通常需要的授予给多种对象,如用户、角色以及组织机构等。
三. 模型复用
对于以上的功能点,提出了相应的解决方案构成如下模型:
n 基于角色的用户安全管理
基于RBAC构成实现功能点的模型,如下:
图表 1 基于RBAC的系统资源权限模型
基于此模型对当前需求的实现方法为:
l 权限的授予
在权限授予时需要实现的为维护用户与角色的关联模型以及角色与权限的关联模型。
同时需要的是资源以及操作的维护,资源上配置的主要为功能模块的一些相关信息,如名称、描述等,操作上配置的主要为功能模块所需要受控的操作,如对功能模块的访问、保存动作等,此处的关键在于配置操作所对应的命令,在B/S体系中通常是URL,在C/S体系中有可能是Command或其他的入口关键字。
l 角色权限的继承
角色权限的继承通过角色的子关联来实现,遵循的原则为子角色自动拥有父角色的所有权限,在进行授权动作时所需要做的是维护角色父子关系关联模型。
l 权限的包含与排斥
权限的包含通过权限的子关联来实现,遵循的原则为父自动拥有子的概念,在进行授权动作时所需做的是维护权限的父子关系关联模型。
权限的排斥在此模型中没有考虑。
n 系统资源(功能模块)操作的控制
系统资源操作的控制基于图表1的模型而得以实现。
l 正常途径系统资源操作的控制
此时通常的做法是在菜单、按钮、链接这些显示之前做对应的资源操作权限的判断。
判断的方法为获取用户所在的角色,判断用户角色是否有进行资源操作的权限(同时需判断权限的包含的问题),如无则递规获取用户角色的父角色是否有进行资源操作的权限。
l 非法途径系统资源操作的控制
对于非法途径对系统资源操作的访问,通常的实现方法为在具体的对象执行前做截断处理,通常采用Proxy或Interceptor模式。
n 数据资源操作的控制
数据资源操作的控制则难以基于上面的权限模型进行实现,需要对其进行扩展,产生的实现需求的模型为:
图表 2 数据资源权限模型
基于此模型对于数据资源操作的控制的实现主要在两个方面:
l 数据资源操作权限的授予
在进行数据资源操作权限的授予时维护权限授予模型,同时需要根据数据资源操作权限的授予同步校验权限模型(此时需要考虑权限的继承、包含的问题)。
l 数据资源操作权限的校验
校验时通过校验权限模型即可完成。
四. 问题
在文中提及的权限模型确实可以实现功能需求,但其在开发过程中以及应用过程中通常有这样的问题:
n 系统资源操作控制时权限校验的低效
通常的解决方案是cache机制。
n 数据资源操作权限授予的低效
n 权限系统对于原有系统的侵入性
通常的解决方案有Proxy、Interceptor、AOP。
ps: 这篇相对于我之前的漫谈权限系统系列的文章来说相当于只是个抽取和归纳,详细的还是得看那个系列的几篇文章。