发新话题
打印

[FleaPHP] [RBAC]一个复杂权限问题的分析

[FleaPHP] [RBAC]一个复杂权限问题的分析

[RBAC]一个复杂权限问题的分析

(1)权限结构


(2)职位级别文字说明

局长,副局,科长,副科,科员

要求:
     1、只有级别高的给低的制定学习计划任务;
     2、局本部对应的科室可以给基层单位对应科室的制定学习计划;


举例说明:

1、局本部的局长可以给任意部门及基层单位人员制定学习计划;
2、局本部调度室可能给基层单位(城区供电局)的调度室制定学习计划;
3、局本部、基层单位科长同样也可以给所在科室科员制定学习计划;
4、副局可以给分管的科室的所有科长,副科,科员,及基层对应管辖的科室制定学习计划;



分析说明:

第一部分:

首先将单位抽象成层次化的节点,一个节点下可以有子节点,子节点之下又有子节点。所以不管是局本部还是基层单位还是单位中的各个科室,都是一个层次化的节点树。

不过单位和科室显然是不同类型的节点,这里需要特别处理。科室节点还要分类型:比如调度室、办公室。因为在下一部分的权限检查中,还存在同类型科室给下级单位的同类型科室安排学习计划的问题。

有了节点和角色后,就可以给每个节点添加用户了,然后为用户指派角色。

几个职位(局长,副局,科长,副科,科员)则看作用户角色。但是对于副局,还有分管科室的问题,所以每个用户角色还有一个属性:是否可以设定分管科室。同样,每个用户也有一个属性:分管科室列表。

通过结合角色的“是否可以设定分管科室”属性和用户的“分管科室列表”属性,我们就可以在系统中很灵活得为一个用户指定其分管的科室。


第二部分:

这个系统的权限比较麻烦,因为判断某个用户能够做什么操作(该操作指为其他用户安排学习计划)不但要判断该用户的角色(既职位),还要判断该用户的属性(副局能给自己分管的科室及下级单位同类型的科室安排学习计划;科长/副科/科员可以给下级单位的同类型科室安排学习计划)。

所以不可能用一个通用的权限系统来解决。比较简单而直接的做法就是为每一个角色编写一段权限验证代码。这段代码首先取得用户的属性(所在单位/所在科室),然后根据其角色进行判断。

例如对于某一个科长的权限验证:

1、获取可以安排学习计划的对象的列表:
    1.1 取得这个科长所在单位和所在科室;
    1.2 将这个科长所在科室的其他人添加到对象列表中;
    1.3 如果这个科长所在的单位还有下级单位,那么还要取得所有下级单位的科室列表,从中找出下级单位是否有同类型的科室。如果有同类型的科室,则将对应科室的人员列表取出来添加到对象列表中。

2、列出对象列表,进行下一步的操作(安排学习任务)。

此处有一个问题就是:某个科室给下级单位的同类型科室安排学习任务,是直接安排到每一个人头上,还是针对整个科室进行安排。这一点,你没有说明。如果是可以针对整个科室安排,那么权限系统还要变得复杂。


副局的权限验证流程:

1、获取可以安排学习计划的对象的列表:
    1.1 取得这个副局所在单位;
    1.2 取得副局分管科室列表,并将这些科室的所有人添加到对象列表;
    1.3 取得所在单位的下级单位,从中找出下级单位是否有同类型的科室。如果有同类型的科室,则将同类型科室的人员列表取出来添加到对象列表中。

2、列出对象列表,进行下一步的操作(安排学习任务)。


其他几种用户角色的权限判断都是类似的方式,细节上不同而已。

这样虽然每种角色都需要编写单独的判断代码,但是从实现上却比一个完全通用的系统更简单。

第三部分:

其实上面两部分已经能够满足你目前的要求了,因为你的系统中,实际上只有两级单位。所以像副局分管科室这些设置不用考虑有多少层下级单位。

如果需要继续扩展层次,例如城区供电局下面又有几个供电所,那么在取得下级单位列表时还要考虑是取得所有下级单位(包括下级单位的下级),还是只取出直接下级单位。

基本上,我暂时想到的就是这些了,肯定存在不合逻辑或者不严密的地方,你实际操作中作为参考就行了。

TOP

发新话题