权限系统是否要独立于应用系统进行设计一直存在争论,通用的权限成指数的提高了系统的复杂程度,同时执行也影响了系统的执行效率。但是一旦设计完成一个通用的权限系统,可以用于多个项目,大大节省了成本。总结就是一句,为一个项目设计一个权限控制系统是正确的,通用只是为了方便后面项目的重用,节省后续项目的成本,当然前期需要投入了。

权限系统一般分为功能权限数据权限字段权限三种,最简单也是最容易设计成通用的就是功能权限。权限系统的设计说简单也简单,就是能满足当主体(用户)要操作(访问)某个资源(数据)时,去检查下用户是否登记过允许访问这个数据了,最简单地可能只需要一张表格就能完成。

功能权限

RBAC(Role-Based Access Control)通常应用于功能权限,数据权限和字段权限通常直接与User关联。功能权限的常规设计思路就是用户<->角色<->模块(功能)两两关联,当模块特别多时往往就不给角色直接赋予可访问哪些模块,而是给几个可访问模块的列表,这些列表中包含了一些模块,一些系统称之为许可权列表(Permission List)。后面设计功能权限时将会加入许可权列表的概念,以适应复杂的项目。

系统权限java实现原理 系统权限功能的设计_系统权限java实现原理

 

数据权限

数据权限通常要依据规则设置,其核心就是如何设计合理的规则,规则主要包含与、或、非、异或、包含于等逻辑关系,然而关系谓词左边的对象和右边的筛选条件根据目标系统的不同也不同,看下图

系统权限java实现原理 系统权限功能的设计_系统权限java实现原理_02

如果不怕麻烦可以用数据字典对“员工ID”、“ShipAddress”再进行管理,这样这套数据权限管理就可以通用了。个人觉得这样做的意义不大,这些要判断的对象在系统上线前基本上就定义好了,用一个XML配置这些项就可以了。

字段权限

字段权限是对功能权限另一个维度的扩展,一般只管控到哪些字段能不能看,也有系统存在某些用户对某个字段能改,某些不可以,主要看管控的粒度。字段权限的控制采用反向授权(默认都允许,被记录的是不允许访问的)比较好。字段权限和功能权限的设计类似,只要用表记录下来就好,系统有哪些字段可以通过反射方式获得。

 后续将对三个权限分别进行设计,最终做成一个完整的权限系统。