RBAC
RBAC
RBAC 就是一个权限控制模型,这个模型是经过时间沉淀之后,相当通用、成熟且被大众接受认可的一个模型。我的理解是 RBAC 和数学公式是一个道理,数学题可以套用数学公式,而权限系统也可以套用 RBAC 权限模型。
RBAC(Role-Based Access Control)权限模型的概念,即:基于角色的权限控制。通过角色关联用户,角色关联权限的方式间接赋予用户权限。
利用 MySQL 数据库实现了 RBAC 权限模型。因为 MySQL 支持 JSON 类型的字段,所以我们定义多对多关系的时候,可以使用 JSON 数组字段。虽然 Phoenix 也支持 JSON 类型字段,但是相关的函数较少,而且 JSON 类型字段不支持表连接。所以在 Phoenix 中,我们只能用交叉表记录多对多关系了。
一、IDEA 连接 Phoenix
由于 Phoenix 自带的命令行客户端没有图形界面直观,所以我们要借助 IDEA 自带的 DataGrip 功能连接 Phoenix,这样就可以在 GUI 界面上看到各个数据表的结构和数据了。
需要特别说明一句,DataGrip 对 Phoenix 支持的不够完美,带有事务的 SQL 语句都不能执行;而且默认无法查看数据表的记录,只能通过编写 SQL 语句的方式来查看数据。执行 SELECT 语句的时候,还会提示 SQLException,这个异常不用理会,不影响 SQL 语句执行。
二、CRUD 权限模型
在 MIS_MODULE
数据表中,保存了系统拥有的业务模块记录。
主键值(id) | 模块编号(module_code) | 模块名称(module_name) |
---|---|---|
1 | MIS-USER | MIS 端用户管理 |
2 | PATIENT-USER | 患者端用户管理 |
3 | WORKER-USER | 医护端用户管理 |
4 | DEPT | 部门管理 |
5 | MEDICAL_DEPT | 医疗科室管理 |
6 | SCHEDULE | 出诊管理 |
7 | REGISTRATION | 挂号管理 |
8 | VIDEO-DIAGNOSIS | 视频问诊管理 |
在 MIS_ACTION
数据表中,保存的是操作动作记录。
主键值(id) | 动作编号(action_code) | 动作名称(action_name) |
---|---|---|
1 | INSERT | 添加 |
2 | DELETE | 删除 |
3 | UPDATE | 修改 |
4 | SELECT | 查询 |
5 | APPROVAL | 审批 |
6 | IMPORT | 导入 |
7 | EXPORT | 导出 |
8 | BACKUP | 备份 |
9 | ARCHIVE | 归档 |
在 MIS_PERMISSION
数据表中,保存的是权限记录。
主键值(id) | 权限编号(permission_code) | 模块 ID(module_id) | 动作 ID(action_id) |
---|---|---|---|
0 | ROOT | 0 | 0 |
1 | MIS-USER:INSERT | 1 | 1 |
2 | MIS-USER:DELETE | 1 | 2 |
3 | MIS-USER:UPDATE | 1 | 3 |
4 | MIS-USER:SELECT | 1 | 4 |
5 | PATIENT-USER:INSERT | 2 | 1 |
6 | PATIENT-USER:DELETE | 2 | 2 |
7 | PATIENT-USER:UPDATE | 2 | 3 |
8 | PATIENT-USER:SELECT | 2 | 4 |
9 | WORKER-USER:INSERT | 3 | 1 |
10 | WORKER-USER:DELETE | 3 | 2 |
11 | WORKER-USER:UPDATE | 3 | 3 |
12 | WORKER-USER:SELECT | 3 | 4 |
13 | DEPT:INSERT | 4 | 1 |
14 | DEPT:DELETE | 4 | 2 |
15 | DEPT:UPDATE | 4 | 3 |
16 | DEPT:SELECT | 4 | 4 |
在 MIS_ROLE
数据表中,保存的角色记录。
主键值(id) | 角色名称(role_name) | 备注(remark) |
---|---|---|
0 | 超级管理员 | 超级管理员 |
我们看看角色和权限是怎么关联在一起的,MIS_ROLE_PERMISSION
数据表是角色和权限的交叉表。
主键值(id) | 角色 ID(role_id) | 权限 ID(permission_id) |
---|---|---|
0 | 0 | 0 |
最后需要把用户和角色关联在一起,需要用到 MIS_USER_ROLE
交叉表。
主键值(id) | 用户 ID(user_id) | 角色 ID(permission_id) |
---|---|---|
0 | 0 | 0 |
三、查询用户拥有的权限
我们在 IDEA 工具上面,编写如下的 SQL 语句,就可以查询到某个用户具备的权限了。
1SELECT p."permission_code" AS "permission"
2FROM HOSPITAL.MIS_USER u
3 JOIN HOSPITAL.MIS_USER_ROLE ur ON ur."user_id" = u."id"
4 JOIN HOSPITAL.MIS_ROLE_PERMISSION rp ON rp."role_id" = ur."role_id"
5 JOIN HOSPITAL.MIS_PERMISSION p ON p."id" = rp."permission_id"
6WHERE u."id" = 0;