IFPMS-设计
对于权限管理来说,最主要的就是人员、角色、权限、资源及其它们之间的关系,权限控制就是控制当前登录的人员是否能够使用某些功能,而功能的使用其实是由URL是否可以访问、页面元素是否显示来控制的。所以,无论是什么实现方式,最终对于系统内部来说需要的只是人员和资源的映射,即当前登录人能够使用哪些资源。而权限和角色只是个名词而已,在其中只是起到一个串联的作用。
根据上文所述,数据库设计就清晰可见了,如下图:
数据库已经记录了人员和资源的关系,但是真正应用到系统中,还需要确定数据库中的资源和真实的资源的关系,另外还需要识别当前的登录人员。
当前的登录人员可以用Http Session来记录,真正有用处的其实就是UserID,这是用户访问系统的唯一凭证,而一般的系统中都是这样做的。
比较麻烦的是资源的映射关系,由于系统架构的不同,其映射的实现是不同的。在.NET Web Form中,可以使用一个基类,基类包含一个抽象属性,每一个Page需要实现这个抽象属性,并且要赋予其唯一值,这个唯一值就是页面资源标识,然后每一次加载页面时都在Page_Load之前验证人员与资源之间是否存在关系,从而控制人员对于此页面的访问权限。
而在IFPMS中使用的是SpringMVC作为Web应用框架,那么资源就可以通过拦截器进行控制。在这个系统里,定义了两个注解和两个拦截器,这两个拦截器分别用于拦截Conroller内添加了注解的Method。如果某个Method添加了登录注解,则验证Session内是否具有用户登录凭证,即UserID;如果某个Method添加了权限注解,则首先要确定当前请求为非匿名访问,即已登录,然后再验证当前登录人员是否能够访问此Method映射的Request Url,最后检查此Url是否具有ModelView,如果具有则按照ViewName取得资源列表并输出到视图。
由于视图引擎使用的是Beetl,所以通过视图引擎能够比较方便的控制资源的显隐,如果输出到视图中的资源列表内有所需要的资源Code,则显示或可用此资源,否则隐藏掉此资源或者将其置为不可用。
至此,整体的设计思路已经阐述完毕,某些细节可以参考系统源码。
我是Python开发者,所以只能参考设计思想,代码实现上不太好借鉴,您的设计思想我非常认同,所以冒昧请教下:
1、MF-PMS中关于资源管理这一块,URL和页面类型有什么区别,填写的资源代码怎么利用的?
2、我看后台的菜单管理是针对这个系统本身的,如果提供给其他多个系统作为通用权限管理系统,这个菜单级别的权限控制有必要做到资源管理中吗
您好,第一个问题:它们本质上没什么区别,就是一条数据库记录而已,只不过URL对应的是页面地址,是对服务端访问的拦截,而Tag其实对应的是页面资源,这其实是为了页面好看、用户体验好而已。第二个问题:菜单其实也可以做到资源里面,我在实际的应用开发中就遇到过这方面的需求,所以做到资源里面也无妨,但是不要把它作为功能模块的划分,因为对于一些复杂的应用系统来说,一个菜单链接可能只是作为一个入口而已,入口里面包含的东西难以想象。希望回答对您有帮助,有问题欢迎再讨论。