目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

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)
1MIS-USERMIS端用户管理
2PATIENT-USER患者端用户管理
3WORKER-USER医护端用户管理
4DEPT部门管理
5MEDICAL_DEPT医疗科室管理
6SCHEDULE出诊管理
7REGISTRATION挂号管理
8VIDEO-DIAGNOSIS视频问诊管理

MIS_ACTION数据表中,保存的是操作动作记录。

主键值(id)动作编号(action_code)动作名称(action_name)
1INSERT添加
2DELETE删除
3UPDATE修改
4SELECT查询
5APPROVAL审批
6IMPORT导入
7EXPORT导出
8BACKUP备份
9ARCHIVE归档

MIS_PERMISSION数据表中,保存的是权限记录。

主键值(id)权限编号(permission_code)模块ID(module_id)动作ID(action_id)
0ROOT00
1MIS-USER:INSERT11
2MIS-USER:DELETE12
3MIS-USER:UPDATE13
4MIS-USER:SELECT14
5PATIENT-USER:INSERT21
6PATIENT-USER:DELETE22
7PATIENT-USER:UPDATE23
8PATIENT-USER:SELECT24
9WORKER-USER:INSERT31
10WORKER-USER:DELETE32
11WORKER-USER:UPDATE33
12WORKER-USER:SELECT34
13DEPT:INSERT41
14DEPT:DELETE42
15DEPT:UPDATE43
16DEPT:SELECT44

MIS_ROLE数据表中,保存的角色记录。

主键值(id)角色名称(role_name)备注(remark)
0超级管理员超级管理员

我们看看角色和权限是怎么关联在一起的,MIS_ROLE_PERMISSION数据表是角色和权限的交叉表。

主键值(id)角色ID(role_id)权限ID(permission_id)
000

最后需要把用户和角色关联在一起,需要用到MIS_USER_ROLE交叉表。

主键值(id)用户ID(user_id)角色ID(permission_id)
000

三、查询用户拥有的权限

我们在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;

image.png

image.png


作者:Soulboy