权限设计系统——RBAC
? 权限系统是针对与用户设计,不同的用户进入拥有不同的身份,而不同的身份则会导致他们能够使用到系统中的功能出现不同。这些功能即需要前端展示时的控制,也需要后端权限的校验。
1. RBAC
? RBAC(Role-Based Access Control)是一套很成熟的权限设计模型。是一个基于角色所控制的系统,所谓角色,就是用户的身份,整个模型围绕着角色设计。
? 一种常见的权限设计模型如下图:
? 将用户和所对应的权限直接关联,这种将用户和权限直接关联的方式看起来很直接。一个用户可以拥有多个权限,而这些权限的信息都储存在用户权限表中,在小规模系统,或者说用户较少时比较便于管理,逐个用户授权,人说较多时,就显得有些麻烦,大部分的用户可能都是拥有者同样的权限,重复性极高。这个时候既可以引入角色。
? 每一个普通员工有用的权限一定是一样的,部门管理者在权限上可能存在差异,而这一部分人往往是少数。设计以角色为核心的权限系统,可以减少数据库开销的同时,减少使用者的重复工作,这对于使用者是很友好的。RBAC的设计模型如下图:
2. 数据库设计
2.1 部门表(sys_dept,非必须)
? 部门表主要是用来存放部门的基本信息。
字段 | 备注 |
---|---|
dept_id | 部门编号 |
dept_name | 部门名称 |
pid | 部门父id |
2.2 用户表(sys_user)
? 用户表主要用来存放用户的基本信息。
字段 | 备注 |
---|---|
user_id | 用户编号 |
username | 用户名 |
password | 密码 |
dept_id | 所在部门编号 |
2.3 角色表(sys_role)
? 角色表主要用来存放角色的基本信息。
字段 | 备注 |
---|---|
role_id | 角色编号 |
role_name | 角色名称 |
2.4 权限表(sys_permission)
? 权限表是用来存系统中包含的权限信息的。
字段 | 备注 |
---|---|
per_id | 权限编号 |
per_name | 权限名称 |
per_nation | 权限的标识符 |
2.5 用户角色表(sys_user_role)
? 用户角色表是用来存放用户和角色的对应关系,理论上来说,用户和角色应该是一对一的,但是,在实际的生产环境中,一个用户往往有多个角色,即兼任。
字段 | 备注 |
---|---|
user_id | 用户编号 |
role_id | 角色编号 |
2.6 角色权限表(sys_role_permission)
? 角色权限表是用来存放角色和权限的对应关系,该表中,角色和权限应该是一对多的关系。
字段 | 备注 |
---|---|
role_id | 角色编号 |
per_id | 权限编号 |
3. 拓展
? 当然,一个权限系统一定不能只有已上几张表,为了实现菜单的动态化,需要补充三张表,补充后的结构如下:
3.1 菜单表
? 菜单表是用来存放菜单的基本信息。
字段 | 备注 |
---|---|
menu_id | 菜单编号 |
menu_name | 菜单名称 |
url | 菜单所指向的地址 |
type | 菜单的类型(包括目录、菜单以及按钮) |
icon | 菜单的图表 |
pid | 菜单的父id |
3.2 角色菜单表
? 角色菜单表是用来存放角色所拥有的的菜单。
字段 | 备注 |
---|---|
role_id | 角色编号 |
menu_id | 菜单编号 |
3.3 菜单权限表
? 菜单权限表用来存放菜单的权限。为了能够控制菜单的动态显示、访问,所以给每一个菜单也设计了权限,这样看起来有些臃肿,一种简化方式是将菜单权限表省略,然后在菜单表中添加 permission 字段,代表改菜单所需要的的权限。
字段 | 备注 |
---|---|
menu_id | 菜单编号 |
per_id | 权限编号 |