一. 概述
本文根据对中小型应用系统的权限系统的需求进行阐述,并对通常用于实现权限系统的两种思想、技术策略以及技术实现方案进行描述,比较其优缺点,同时对开源类型的产品进行介绍,最后结合自己的实际经验介绍自己的实现方案以及碰到的难点。
本文并不是什么理论化的文章,完全是实战型的总结和实战的讨论,至于理论请大家去参考更为专业的文章。
二. 目的
此文的编写作为自己对于权限系统进行系统化的整理,毕竟权限系统是几乎所有系统中都需要的,但一直以来由于在权限系统上并没有什么通用的方案,所以几乎是N多的人都实现了自己的一套,在此我也是抛砖引玉。
三. 需求
3.1. 描述
这里对于需求的描述都是基于自己工作以来实际项目需求的经验而综合的,如有遗漏之处欢迎大家补充,不过也希望大家明白范围,是指中小型系统,至于大型的企业系统从来就没做过,我也无从提出需求。
从一个实际的场景来描述一般中小型系统中涉及的权限需求吧,在通常的B/S系统中,首页列出不需登录可访问的信息,登录后则根据用户拥有的权限显示相应的菜单,在具体菜单对应的模块里根据用户的权限显示相应权限的按钮,同时显示当前用户可访问的相应的资源。
非功能性的需求:
l 简便的授权方式。避免每增加一个用户就要不断的去授予N多的权限,避免相同权限的用户还要去相同的授予,提供出分组的功能。
l 权限的继承。在上面提出分组的功能后考虑到组应支持嵌套功能,即子组自动继承父组的权限,这样授权时就更加简便了。
l 高性能。不能因为校验权限而严重影响到系统的性能。
l 安全性。除正常途径方式访问系统的保护外,也需要避免通过非正常的途径访问系统中受保护的资源。
除了这些用户通常直接提出的需求外,在实际的项目中通常还会有这些需求:
l 权限的排斥和包含。用户在实际的使用后通常会提出这个需求,权限的排斥主要是指当用户拥有权限A时则不能同时再拥有权限B,这个在实现了权限继承的系统中尤为突出;权限的包含主要指当用户拥有权限A时自动拥有了权限B,实际的例子是当用户拥有管理权限时自动同时拥有访问权限。
l 系统资源权限的继承。在对带有分级性质的资源进行授权时子资源自动继承父资源的权限,这个在文档管理类型的系统中比较常见,即目录中的文档自动拥有目录的权限。
l 系统资源权限的多种授予对象。通常系统的权限是授予到角色中,而对于系统资源的权限授予上用户在使用后通常会提出需要授予到多种对象,除角色之外还需可授予给组织机构或者具体的用户。
3.2. 分析
对需求中列出的场景进行分析:
l 上下文
未登录用户、登录用户、管理用户不同的界面等情况。
l 问题
如何识别是否为登录用户、管理用户或未登录用户。
l 解决方案
提供身份认证功能,通过此功能标识用户身份。
l 上下文
根据用户拥有的权限显示相应的菜单,在具体菜单对应的模块里根据用户的权限显示相应权限的按钮。
l 问题
由于菜单或者按钮都是通过触发链接或命令的方式来实现其功能,那么在权限系统中需要做到的即可通过判断用户是否具有执行此链接或命令的权限来实现对于菜单和按钮的显示的控制。
这样带来的问题就是如何判断用户是否拥有执行某链接或命令的权限以及如何根据此结果去隐藏菜单和按钮的显示。
l 解决方案
提供校验用户是否拥有执行某链接和命令的权限的功能。
提供控制菜单、按钮显示的功能。
l 上下文
显示当前用户可访问的相应的资源,有两种情况,一种是全部显示,一种是分页显示。
l 问题
如何判断用户可访问哪些资源,资源如何进行分页处理。
l 解决方案
提供获取用户权限范围内的资源的功能,并提供全部获取和分页获取两种方式。
l 上下文
简便的授权方式。
l 问题
为提升用户授权的简便性,将权限授予给角色或组,用户只需要属于这个角色或组即可拥有相应的权限。
如何建立满足需求的授权模型。
l 解决方案
根据需求建立相应的授权模型。
根据对需求的分析,可以得出权限系统需要做到如下的功能:
l 用户身份认证。
l 校验用户是否拥有执行某链接和命令的权限的功能。
l 控制菜单、按钮显示的功能。
l 获取用户权限范围内的资源的功能,并提供全部获取和分页获取两种方式。
l 建立相应的授权模型。
在非功能性需求方面权限系统需要考虑如下几个方面:
l 权限的继承。
l 权限的排斥和包含。
l 高性能。
l 安全性。
l 系统数据的权限的继承。
l 系统数据的多种授权对象的支持。
根据这些对权限系统的功能需求和非功能性需求,我们可以合并和归纳成如下的一个表格作为对权限系统的需求:
功能点 |
描述 |
身份认证 |
提供用户身份认证的功能,以标识用户是否登录、是否为管理员等身份。 |
资源权限校验 |
判断操作主体是否具有对某资源进行某操作的权限。 |
数据权限校验 |
获取用户权限范围内的数据的功能,并提供全部获取和分页获取两种方式。
系统数据的权限的继承。
系统数据的多种授权对象的支持。 |
授权模型 |
系统权限的授予模型决定了权限系统使用的易用与否。
权限的继承。
权限的排斥和包含。 |
权限校验的体现 |
控制菜单、按钮的显示。 |
高性能 |
高效的授权与高效的权限校验。 |
安全性 |
防止非法途径对于系统受保护资源的访问或操作。 |