上篇的图这里再插入一遍:
讲完功能点,应该来讲一下如何创建角色,为什么角色与功能点之间完全没有关联,实际上很简单,我在上篇中已经把这个道理说明了,如果我们的功能点仍然有增加,删除,修改,查看,对应的权值分别是1,2,4,8,那么当我们创建一个角色B,要求角色B拥有这四个功能点的时候只需要进行如下操作:1 + 2 + 4 + 8 =15 即可,把15这个值以及新建的角色信息存入角色表即可。那么当用户登陆的时候,只需要从用户角色对应表当中找到对应的角色,并把角色的权值做计算即可,假如又有角色C的权值为1,而用户A同时具备角色B以及角色C,那么当用户登陆的时候只要根据关联表找到他对应的两个角色,再把角色B以及角色C的权值进行按位或操作,即:1 | 15 = 15,15这个值就是用户A所具有的权值了,我们把这个权值保存起来,放入Session或者Cookies当中,显然15这个权值与1,2,4,8做按位与操作的时候皆可得到1,2,4,8,于是用户A就得到了角色B以及角色C的权限,并且角色B跟角色C的权限已经进行了合并。至此,用户登陆完之后就与数据库脱离了关系,所有权限的判断只需要拿具体功能点的权值与用户的权值进行按位与操作即可,不用再查表或者遍历功能点集合。至于角色的更新,只需要把新计算出来的权值更新到对应的角色即可。
针对实际情况,我们不可能在判断某个用户是否有某个功能点的时候都拿个数来与当前用户的权值做比较,更多是把它抽象为一个方法:
if (roleHandle.CheckUserPer("CreateTipType"))
{
//..
}
如上所示,CreateTipType对应的是一个业务的功能点名称,他对应一个权值,以上所说的过程全部集成在一个方法里面判断就可以了,当然你要用什么方式来做你的功能点与权值的对应都可以,并不一定要用名称,也可以用约定好的数字甚至其他表达方式都可以,但是绝对比你直接传个数字来得直观。
采用这种做法的时候,还会碰到很多具体的问题,诸如菜单的生成,权值的配置,角色的配置,角色的更新,用户权值的更新与保存等实际问题,我这里就不做一一说明了,感兴趣的朋友我们可以一起讨论。