搭建一套通用的后台管理框架对于以后的快速开发时是非常重要的。通常框架需要包含权限验证、日志、及一些基础数据的增删改查功能。
本框架采用Spring MVC+Mybatis+Freemarker+Adminlte前端 组合在一起搭建一个管理系统。
大概的样子如下:
1.权限
角色->应用->模块->功能
数据库专门建立了一张功能表sys_Function,它属于某个模块,它有个权限值字段(该值为2的指数倍,为什么,下面再解释?)。
如何判断某个角色是否可以进行某个功能操作(例如删除模块)?
如上图角色权限表sys_RolePermission所示,该表有个字段P_Value等于P_ModuleCode模块所选功能的权限值之和。
例如功能管理模块定义了4个功能,分别为查看、添加、修改、删除功能,这4个功能的权限值分别为1、2、4、8,那么sys_RolePermission的该模块的权限值P_Value如果等于1,则表示只有查看功能,如果等于3,则表示具有查看和添加功能,如果要具有所有功能,则值要等于1+2+4+8=15。
那如果某个用户多个角色对同一个模块有不同的权限值,例如用户x具有角色1和角色2,角色1对模块a的权限值为3,角色2对模块a的权限值为9,那用户对模块a的权限应该是多少呢?其实只要做一个按位与操作即可,即1&9=11,并不是1+9=10.这就是为什么让功能值设置为2的指数倍形式的原因,其实质是为了进行二进制的操作。假如有4个功能,则将权限值用4位的二进制形式表示,每一位分别表示一个功能,0表示无权限,1表示有权限。同理3的二进制形式为0011,9的二进制形式为1001,作与运算后的结果为1011,即权限值为11。
最后判断是否具有某功能,则用该功能权限值与计算后的角色权限值作与运算,例如上面判断是否具有修改功能(权限值为4),将4与11作与运算,4&11=0,则表示无权限,而添加功能(权限值2),2&11=2,则表示有权限,同理删除功能(权限值8),8&11=8表示有权限。
2.日志
写日志功能用到的是AOP切面技术,这样可以与实际的业务代码相分离,互不影响。
<beans:bean id="aspectEventLog" class="com.jykj.check.filter.EventLogAspect" />
<!-- <aop:aspectj-autoproxy /> -->
<!-- 对带有@Operation注解的service包及其子包所有方法执行写日志操作 && execution(* com.jykj.check.service.*.*(..)) -->
<aop:config