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语句,就可以查询到某个用户具备的权限了。
SELECT p."permission_code" AS "permission"
FROM HOSPITAL.MIS_USER u
JOIN HOSPITAL.MIS_USER_ROLE ur ON ur."user_id" = u."id"
JOIN HOSPITAL.MIS_ROLE_PERMISSION rp ON rp."role_id" = ur."role_id"
JOIN HOSPITAL.MIS_PERMISSION p ON p."id" = rp."permission_id"
WHERE u."id" = 0;