【华夏OA项目实战】E2-24 掌握RBAC权限模型

本课程开发软件与项目初始代码可以通过云盘下载,答疑服务可以关注视频片头的二维码获取。
https://www.123912.com/s/A75eVv-27mod,提取码:yton

教学视频

SaToken是认证与授权框架,认证指的是要求用户必须登录才可以使用服务,授权是要求用户必须具备某个权限或者角色才能使用服务。在BFF上面使用SaToken认证服务很简单,定义配置信息即可(我们在Nacos上面给MIS系统定义过SaToken配置信息),但是想要开启SaToken的授权服务,需要我们定义Java类并且写一系列的代码才可以。这节课我们先来学习RBAC权限模型。

一、RBAC权限模型

RBAC的基本思想是把各种权限不直接授予用户,而是通过角色把权限赋予用户。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。

RBAC模型中的权限是由模块和行为合并在一起而产生的,在MySQL中,有tb_module(模块表)和tb_action(行为表)。这两张表的记录合并在一起就行程了权限记录,保存在tb_permission(权限表)中。

现在知道了权限记录是怎么来的,下面我们看看怎么把权限关联到角色中。传统一点的做法是创建一个交叉表,记录角色拥有什么权限。MySQL 5.7之后引入了JSON数据类型,所以我在tb_role(角色表)设置的permissions字段,类型是JSON格式的。到目前为止,JSON类型已经支持索引机制,所以我们不用担心存放在JSON字段中的数据检索速度慢了。MySQL为JSON类型配备了很多函数,我们可以很方便的读写JSON字段中的数据。

接下来我们看看角色是怎么关联到用户的,其实我在tb_user(用户表)上面设置roles字段,类型依旧是JSON的。这样我就可以把角色关联到某个用户身上了。

二、如何查询用户的权限列表?

如果我们想要查询某位用户拥有什么权限应该怎么写SQL语句?下面的SQL语句利用表连接的方式,先查询用户具备什么角色,然后查询这些角色具有什么权限。

SELECT DISTINCT p.permission_code AS permissionCode
FROM tb_user u
JOIN tb_role r ON JSON_CONTAINS(u.roles, CAST(r.id AS CHAR))
JOIN tb_permission p ON JSON_CONTAINS(r.permissions, CONVERT(p.id, CHAR))
WHERE u.id = #{userId}
  AND u.status = 1
  AND r.status = 1

三、编写持久层代码

oms子系统的UserMapper.xml文件中,定义SQL语句,查询用户的权限。

<select id="searchUserPermissions" parameterType="long" resultType="String">
    SELECT DISTINCT p.permission_code AS permissionCode
    FROM tb_user u
    JOIN tb_role r ON JSON_CONTAINS(u.roles, CAST(r.id AS CHAR))
    JOIN tb_permission p ON JSON_CONTAINS(r.permissions, CONVERT(p.id, CHAR))
    WHERE u.id = #{userId}
      AND u.status = 1
      AND r.status = 1
</select>
<select id="searchUserRoles" parameterType="long" resultType="String">
    SELECT r.name
    FROM tb_user u
    JOIN tb_role r ON JSON_CONTAINS(u.roles, CONVERT(r.id, CHAR))
    WHERE u.id = #{userId}
      AND u.status = 1
      AND r.status = 1
</select>

UserMapper.java接口中,定义抽象DAO方法。

public interface UserMapper {
    public ArrayList<String> searchUserPermissions(long id);
    public ArrayList<String> searchUserRoles(long id);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值