在说明AySuite权限的实现之前先来看看角色权限控制系统(RBAC),相关的资料可以找到很多,这里不在重复。
提供几个参考
http://www.javaedu.com/bbs/viewthread?thread=143
http://www.cnblogs.com/windinwing/archive/2007/11/11/956043.html (注意那个OR图例)
总而言之这就好比班级里面的班干部,班长、学习委员等职位可以看似角色,而班长对应的所有职能就是角色权限了,而班长其人就对应用户了。
在理解相关感念和比较后设计的角色权限表如下:ay_是表前缀;与application相关的字段暂且不管;
下面举例 roles表的数据
然后对应 rolepermission 的数据有
对应module
譬如用户Demo 的ID为0 所属角色ID为2(即技术员),则相应对于模块 系统跟踪 的权限值为150
那么究竟权限值150包含了那些操作,下面我们就来说说权限值的算法。
AySuite权限值的算法
采用2的n次幂组成权限值的集合,如1、2、4、8、16...,某用户的权限值为其子集中的整数之和,如 7=1+2+4,5=1+4。如果要从数据库检索包含某几种权限的用户,则先把这几种权限值相加,假设和为k,然后select * from table where 1 and 用户权限值 = 'k';如果要判断某用户有哪些权限,则取出其权限值k,分别用k&1,K&2,K&4,k&16...,如果为真,则 表示有值等于“&”右边整数的权限,例如,如果k&4为真,则此用户有权限表中值等于4的权限;
系统中权限值对应的ACTION如
popedomType.put("Details", 2);
popedomType.put("Create", 4);
popedomType.put("Edit", 8);
popedomType.put("Delete", 16);
popedomType.put("Orderby", 32);
popedomType.put("Print", 64);
popedomType.put("List", 128);
不难算出150=128+16+4+2
module表中的 M_Directory字段和ACTION即可组合成一个URL 如
[BugTracker/edit]
然后把坚持当前用户权限的方法写到拦截器中即可实现RBAC。