一、权限管理综述
通观系统,用户和系统使用范围之间的关系被称作权限,权限是可以被定义的,即是这种关系是可以被定义的,这种关系的对象就是用户和系统使用范围;用户有各种各样的分类,一般是按部门,也可以按属性进行分类;系统使用的范围,一般都有各级菜单,菜单里面是页面,页面上面是操作,操作里面有数据,数据里面有字段等等,粒度越来越细,权限管理越来越精准,可定义,很灵活。
二、普通权限管理回顾
目前比较成熟的权限管理,是用户和菜单甚至到菜单页面动作(action)级别的关系---称之为菜单+操作权限。
普通权限管理就是定义用户和功能之间的关系。
用户:指的是单个用户,也可以是一组用户,这一组用户可以是按部门划分的组,也可以是按群组概念灵活组成的集合。
功能:可以是菜单,菜单中大中小分类,也可以是菜单中的操作,每个操作(button),也可以分为可见(disabled不可click),可读(可以click,不可action),可用。
权限管理就是定义用户和功能之间的关系,这就是普通权限管理,缺陷就是只停留在功能权限管理上,缺少数据权限管理。
三、数据权限之我见
数据权限管理的解决方案五花八门,下面就分析一下数据权限之我见。
数据权限就是在功能权限基础上,对所处理的数据进行范围限定。
数据权限一般分为三种:
A.公开:就是在使用系统功能的基础上,所涉及的数据都是公开的,是全系统可见的,不用做任何限定,这种方式就是传统的普通权限管理,也即是功能权限管理,不涉及数据权限管理的情况。
B.部分公开(或者叫半公开):就是对系统各种功能下,所涉及的数据进行划定范围,并且定义用户和范围的对应关系,这就是数据权限管理。
C.不公开:或者叫私密信息保护,在这种情况下,分为个人私密信息、部分私密信息两种。个人私密信息就是完全不公开,只有自己可见的信息。部分私密信息就是部分范围公开,就是按照个人所在不同范围下的公开。即是个人私密信息,各种组范围私密信息。
注意点:各种组私密信息和部分公开信息的区别在于,各种组私密信息是部分公开在个人所在的各种组范围中;部分公开是公开在特定的各种组范围中。前者是以个人为中心,后者打破了这种限定。
四、数据权限管理实现的方案
定义权限表,也就是关系表。
A.定义角色:角色就是把使用者分组。一个使用者可以进入多个角色。
B.定义功能:功能就是把最小单位的操作任意组合起来,这个“任意”用词不准确,应该有条件地组合在一起,一般是一个菜单,一个一面等。
C.数据作用域:就是功能中的选择器,一般是SQL文的where子句,或者功能的一个子条件。
最后,权限表就产生了,就是A-B+C的关系表,也即角色和B+C的关系表,B+C的意思是,C是依附于B的,C就是所谓的数据权限。
五、方案具体实施
在没有C的情况下,A-B的实现就是普通的菜单权限管理,我们重点说一下数据权限的具体实现。
1.在A-B的基础上,在实现具体功能时,把数据范围作为条件具体化,可定义,可选择
条件库表设计如下:
+---------+------------+----------+------------+-------------+------+
| 功能ID | 功能名称 | 操作ID | 操作名称 | 条件组合 | 备注 |
+---------+------------+----------+------------+-------------+------+
2.实现一个条件组合接口:
public String getCondition(String 条件1,String 条件2,String 条件3,。。。)
3.在操作实现方法里
A.如果是SQL,就可以组合出来where 条件语句
public String whereCause(1,0,1,。。。)
return 条件1+条件3;//1表示此条件生效