1. RBAC权限模型
RBAC(Role Based Access Control)是基于角色访问控制。
RBAC实际上就是针对产品去发掘需求时所用到的Who(角色)、What(拥有什么资源)、How(有哪些操作)的方式。
在RBAC模型中,who、what、how构成了访问权限三元组,也就是“Who对What进行How的操作。
2. RBAC的基本思想
就是授权给用户的访问权限,通常由用户在一个组织中担当的角色来确定。RBAC中将权限被授权给角色,角色被授权给用户,用户不直接与权限关联。RBAC对访问权限的授权由管理员统一管理,RBAC根据用户在组织内所处的角色作出访问授权与控制,授权规定是强加给用户的,用户不能自主地将访问权限传给他人,这是一种非自主型集中式访问控制方式。
案例理解:比如在医院中,医生这个角色可以给病人开处方,但他无权将开处方的权力传给其他人(护士、病人等)。
3. 普通用户权限设计
三个表(用户表、权限表、用户权限表)
这种直接将权限赋予给用户的情况,有以下缺点:
- 当用户变多的时候,会有大量的数据冗余(每个用户都有对应的权限存储在用户权限表)
- 添加和删除权限非常的麻烦(添加/删除权限,需要对拥有该权限的所有用户进行操作)
4. RBAC权限设计权限表
五个表(用户表、角色表、权限表、角色权限表、用户角色表)
角色与权限之间: 多对多关联。(产生一张角色权限中间表)
用户与角色之间:多对多关联。(产生一张用户角色中间表)
RABC权限模型的使用步骤
给用户授权的顺序
- 先给角色赋予权限
- 再将角色分配给用户
- 最后用户得到这些角色的所有权限
获取用户权限的顺序(如果想知道一个用户有什么权限,就反向查找)
- 查找到该用户
- 查找该用户的角色
- 通过查询角色的权限,获得该用户的权限
分配权限步骤:从上往下
查找用户权限的步骤:从下往上
5. SaaS-Export的权限表设计
五个表(用户表、角色表、权限表、角色权限表、用户角色表)
角色与权限之间: 多对多关联。(产生一张角色权限中间表)
用户与角色之间:多对多关联。(产生一张用户角色中间表)
角色的本质就是一个集合,里面存放在着权限的名称。
给用户指定角色,其实就是将权限打包给用户。
6. 通过用户名称查询用户的权限(模块)
# 5张表的数据(笛卡尔集)
# 用户表
select * from pe_user;
# 角色表
select * from pe_role;
# 角色用户表(中间表) 得知 一个用户属于哪个角色
select * from pe_role_user;
# 权限表(功能表,模块表)
select * from ss_module;
# 角色权限表(中间表) 得知 一个角色有哪些权限
select * from pe_role_module;
select * from pe_user u,pe_role_user ru,pe_role r ;
查询用户 老王
的权限
- 显示内连接(推荐
inner join
比隐式内连接更快)
## 显示内连接
select m.name from pe_user u inner join pe_role_user ru inner join pe_role r inner join pe_role_module rm inner join ss_module m
on u.user_id = ru.user_id
and ru.role_id = r.role_id
and r.role_id = rm.role_id
and rm.module_id = m.module_id
and u.user_name='老王'
- 隐式内连接(推荐,inner比)
## 隐式内连接
select m.name from pe_user u,pe_role_user ru,pe_role r,pe_role_module rm,ss_module m
where u.user_id = ru.user_id
and ru.role_id = r.role_id
and r.role_id = rm.role_id
and rm.module_id = m.module_id
and u.user_name='老王'