权限
权限是用户可以访问的资源,包括页面权限、操作权限、数据权限
页面权限:即用户登录系统可以看到的页面,由菜单控制,菜单包括 一级菜单和二级菜单,只要用户有一级和二级菜单的权限,那么用户就可以访问页面;
操作权限:即页面的功能按钮,包括查看、新增、修改、删除、审核等。有的系统要求“可见即可操作“,意思是如果页面上能够看到操作按钮,那么用户就可以操作,要实现此需求,这里就需要前端来配合,前端开发把用户的权限信息缓存,在页面判断用户是否包含此权限,如果有,就显示该按钮,如果没有,就隐藏该按钮。某种程度上提升了用户体验,但是在实际场景可自行选择是否需要这样做;
数据权限:数据权限就是用户在同一页面看到的数据是不同的。
一、RBAC0权限模型
这是权限最基础也是最核心的模型,用户和角色是多对多关系,角色和权限也是多对多关系。
如果用户基数较小,也可以直接把用户和权限关联。但是如果用户基数较大,直接将用户和权限关联,操作起来就会比较麻烦,需要一个人一个人去授权。在这种用户基数较大的情况下,引入了角色概念,一个角色可以与多个用户关联,管理员只需要把角色赋予用户,那么用户就拥有了该角色下的所有权限。
二、RBAC1模型
此模型引入了角色继承概念,即角色具有上下级的关系,角色间的继承关系可分为一般继承关系和受限继承关系。
一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构,实现角色间的单继承。这种设计可以给角色分组和分层,一定程度简化了权限管理工作。
三、RBAC2模型
基于核心模型的基础上,进行了角色的约束控制,RBAC2模型中添加了责任分离关系,其规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。
主要包括以下约束:1、互斥角色:同一用户只能分配到一组互斥角色集合中至多一个角色,支持责任分离的原则。互斥角色是指各自权限互相制约的两个角色。比如财务部有会计和审核员两个角色,他们是互斥角色,那么用户不能同时拥有这两个角色,体现了职责分离原则;2、基数约束:一个角色被分配的用户数量受限;一个用户可拥有的角色数目受限;同样一个角色对应的访问权限数目也受限,以控制高级权限在系统中的分配;3、先决条件角色:即用户想获得某上级角色,必须先获得下一级的角色。
四、RBAC3模型
即最全面的权限管理,它是基于RBAC0,将RBAC1和RBAC2进行了整合。
五、RBAC模型五大属性
1、用户属性
2、角色属性
3、用户与角色的关系
4、权限
5、角色与权限的关系
六、RBAC权限模块必备功能
用户管理
用户列表
添加用户
编辑用户
设置用户角色
角色管理
角色列表
添加角色
编辑角色
设置角色权限
权限管理
权限列表
新增权限
编辑权限
七、相关表设计
1、用户表
2、角色表
3、用户角色关联表
4、权限详情表
5、角色权限关联表
6、用户操作记录表
拓展
权限管理模块,针对整个系统。页面权限、数据权限、操作权限,有些权限设计角色,有些权限设计组织机构,有些权限从模块页面出发,有些权限从组织机构触发,更有针对用户、单一页面、单一功能出发的权限管理。
因此要想设计出一个完整而且适用于所有应用的权限管理模块难度是比较大的。有些系统用户量较小,权限管理不需要多复杂,管理维度较低,有些系统用户量、组织机构、模块划分等比较复杂,单一的权限管理又无法满足。
这里自己尽量尝试设计并说明自己的权限管理系统。
创建表结构
1、sys_module:模块/页面权限信息分栏表
2、sys_auth:权限表
3、auth_conn:权限—角色/用户/部门信息关联表
4、sys_user:用户表
5、sys_role:角色表
6、sys_dept:部门表
ER图
模拟业务场景
1、将某个模块的查看权限授予所有用户
分析:模块权限为查看;权限范围为所有用户
模块表中的id通过权限表sys_auth中的module_id绑定,然后权限表中的id和权限关联表中的a_id绑定,然后将a_id和u_id绑定,u_id和用户表的id关联,可以查询用户具体信息。
用户操作:选中页面,选中授予的权限,选中人员具体名单,点击确定即可。
后台处理:用户在选中页面、选中授予权限的前提下,可以将数据写入模块表和权限表,在选中权限、具体用户的前提下可以写入数据到用户表、权限关联表,如此可形成闭环。
2、将某个模块的查看权限授予某个指定角色
分析:模块权限为查看;权限范围为某个角色下的用户
模块表中的id与权限表中的module_id绑定关系,权限表中的id与权限关联表中的a_id绑定关系,a_id和r_id绑定角色关系,r_id和u_id又可确认角色用户关系。
用户操作:选中页面,选中授予的权限,选中某个角色,点击确定即可。
后台处理:根据用户选中的页面和选中的授予权限,可以将数据写入到模快表和权限表,根据选中的权限和角色可以将数据写入到权限关联表。至于用户与角色的绑定关系,需要在用户操作功能或者角色分配功能上操作分配,将对应数据关系写入权限关联表即可。
3、给某个用户授权某个页面的查看权限
分析:首选选中用户,然后进行某个页面授权
用户操作:点击某个用户,进入授权,选中查看权限,选中具体页面,点击确定即可
后台操作:根据选中的页面和权限,可以将数据写入到模块表和权限表,根据选中的用户和权限,可以见权限和用户进行绑定。
与上面需求不同在于思维方式的不同,逻辑处理并没有台打区别。
功能接口
用户新增
用户修改
用户删除
用户列表查询(所属角色、部门等详细信息,以及拥有权限的模块/页面,以及具体权限信息)
角色新增
角色修改
角色删除
角色列表查询(所绑定用户和用户所属部门等详细信息)
部门新增
部门修改
部门删除
部门列表查询(下属用户及用户绑定角色等详细信息)
新增用户设置为某角色
修改用户设置为某角色
删除用户设置为某角色
新增用户设置为某部门
修改用户设置为某部门
删除用户设置为某部门
角色里面新增绑定用户
角色里面删除绑定用户
角色里面新增绑定部门
角色里面删除绑定部门
部门里面新增绑定用户
部门里面删除绑定用户
部门里面新增绑定角色
部门里面删除绑定角色
模块/页面新增
模块/页面修改
模块/页面删除
模块/页面列表信息(包含模块/页面所拥有权限,以及各权限下的用户,用户信息里面包含用户所属部门和角色信息)
模块新增授权用户
模块修改授权用户
模块删除授权用户
模块新增授权角色
模块修改授权角色
模块删除授权角色
模块新增授权部门
模块修改授权部门
模块删除授权部门
问题考虑
上级角色对下级角色具有管理权限
部门管理员对本部门以及下级部门用户具有管理权限
用户操作绑定部门,或者部门绑定用户的时候,需要新增是否部门管理员的选择。或者单开功能,对选中的部门或用户进行部门管理员设置。