在大学毕业时,写了一个权限管理系统,由于经验不够丰富,所以设计出来的作品,缺点多多。经过一年多的工作,对权限管理系统进行了更加系统的整理与学习,于是重构了整个权限管理系统。
设计目标
实现所见即所得的权限管理系统,权限控制能够精确定位到系统的菜单,按钮。设计原则
由于权限管理系统,大部分都是基于Role Base Access Control原则,在设计中,我也沿用了该原则,然后进行了一些小细节的修改,比如简化分组的授权,简化直接给用户授权等特性。数据库设计
界面技术选型
由于开发的系统是内部系统,整体使用boostrap框架。其中为了更方便的管理资源,使用ztree组件作为树的管理。后台技术选型
后台还是采用擅长的spring + spring mvc + mybatis。设计难点
在权限管理中,数据库的设计并不复杂,所以从技术上而言,难度不大。主要难度在于,如何能够快捷有效的进行授权,以及维护资源权限。为了达到授权与维护的方便,使用了多个尝试,由最开始的jqGrid tree特性,到ztree,再到拖动排序,以及数据库的设计等多次优化。后端实现
在后台,使用Filter对请求进行拦截,如果一个请求,当前用户具备该权限,那么允许访问。在这里面,我们如果对系统所有的url都进行拦截,那么整个资源数据将会非常大,我们的系统,大概有2000多个请求,如果资源管理中,需要维护2000个资源,那么工作量非常大,而且容易出现资源遗漏的情况,导致测试经常出现500的错误。最开始,由于我也是第一次设计一个所见即所得的权限系统,所以选用的方案就是管理系统的所有请求链接,整个资源表高达2000条记录,经常出现500,这个锅是我的。经过后面不断思考,于是去掉了隐含权限。什么是隐含权限呢?比如说:客户管理(xxx/xxx/list.do),那么一般该界面会有一个ajax(xxx/xxx/listData.do)请求,用于获取table的json数据。这种权限需要在授予客户管理时,一并授予给角色。最开始,由于害怕系统出现漏洞,使用了父子权限的设计方案。这种方案,从可行性而言,没有问题,缺点是维护量非常大。后面直接不再维护隐含权限,默认这些隐含权限都允许访问,整个资源表的数据,从2000变成了600,其中功能性链接100多个,按钮权限500个左右。前端实现
在前端,由于需要实现所见即所得,所以对于没有访问权限的按钮,都需要隐藏起来。为了达到这个设计目标,系统在用户登陆时,会将所有的资源code列表,放回到前端js变量中,然后界面初始化时,根据是否具备权限,来控制按钮的显示与否。界面参考
1.资源管理界面2.角色管理界面
总结
设计一个资源管理系统,也来来回回花了不少的时间,这期间由于经验不足等原因,坑了同事,这里面很抱歉。作为一个开发者而言,这两次设计过程,很明显第二次的设计更加流畅,但是也同样遇到不少坑,从js不熟悉,到面向对象js等过程,js的代码提高的很快。所以单纯的学习,不加实践,果然是难以掌握一门技术。好了,希望几个图片,能给读者带来一些设计上的灵感...thank you for reading