目录

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)
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;

image.png

image.png


作者:Soulboy