因为要做的系统是一个过于综合的管理系统,所以在权限管理方面就可能会存在比较复杂的逻辑,经过思考,最终暂定一个比较初步的架构,描述如下:
总体描述:
确定两个主体为 “角色” 与 “数据域”,“角色” 管理某一具体角色所拥有的一众权限,“角色” 是要分配给具体用户的;“数据域” 管理某一用户在某一个权限下所能影响的数据范围。
举个栗子:
“眼科医生” 这个角色拥有 [“查看患者信息”, “挖小鼠眼睛”] 这两项权限;现有两名医生 [“朱欣悦”, “施策”] 拥有 “眼科医生” 这个角色,但是我们赋予两名医生不同的数据域,比如 朱欣悦 大夫比较牛逼,对于她所属 “眼科医生” 角色下所拥有的 “查看患者信息” 这项权限,她可以看眼科 整个科室 的患者信息,但是 施策 大夫可能是刚来的萌新,就比较惨一点,他只能看挂 自己 号的患者。总结一下就是,虽然两名医生都有 “眼科医生” 这个角色,都有 “查看患者信息” 这项权限,但是体现在具体的事情上, 还是反映出了他们各自可以影响的具体数据范围的差异。
具体落实办法:
- 角色-权限:这个比较好理解,角色其实就是起了集成管理权限、权限与用户之间作连接的作用。我们在设计权限的时候,将权限层级通过语义的方式做进去,比如我们用两位字符代表一级权限,AABBCC 这个权限代码就代表了 AA 下的 BB 下的 CC 权限。然后,我们在存储的时候就直接在字段里存权限代码的正则就好了。
- 用户-数据域:这个是新引入的概念,可能比较麻烦一点。上面讲过了,角色只是权限与用户之间为了便于批量管理而抽象出来的一层东西,在 用户甲 获得 权限A 后,为了减少用户的繁琐操作,会有一个默认的数据域(可能就是自己个人),如果想修改这个数据域,我们就要以 用户甲 和 权限A 为条件(因为角色绑定到人,所以在用户甲选出来的那一刻,目标角色就已经确定了)列出一个展现所有数据域的数据结构(可能是一棵树)让权限管理者去选。选完之后,用户甲 在 权限A 下的数据结构就确定了。当然,此处在存储的时候也要用到正则表达式。
总结一下:
权限 是通过 角色 绑定到 用户 的,用户 在某一 权限 下拥有自己所特有的 数据域。