沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • 设计须知

  • UML画图

  • 权限校验

    • 什么是RBAC权限模型?
      • RBAC 是个啥
      • 应用示例
      • 表结构设计
        • sys_user(用户信息表)
        • sys_role(角色信息表)
        • sysuserrole(用户和角色关联表)
        • sys_menu(菜单权限表)
        • sysrolemenu(角色和菜单关联表)
      • 学习参考
    • 那些鉴权相关的知识
    • 深入了解 Bearer 模式
    • JWT 基础小结
    • token令牌问题
    • 安全框架SpringSecurity入门
    • SpringSecurity+OAuth2入门
  • 设计模式

  • 系统设计
  • 权限校验
沉梦听雨
2024-10-19
目录

什么是RBAC权限模型?

# 什么是 RBAC 权限模型?

# RBAC 是个啥

RBAC 就是一个权限控制模型。

  • RBAC(Role-Based Access Control)权限模型的概念,即:基于角色的权限控制。通过角色关联用户,角色关联权限的方式间接赋予用户权限。

  • 之所以在 用户 和 权限 在中间加一层 角色,是为了增加安全性和效率,而且后续扩展上也会提升不少。

打个比方,

  • 比如多个用户拥有相同的权限,在分配的时候就要分别为这几个用户指定相同的权限,修改时也要为这几个用户的权限进行一一修改。
  • 有了角色后,只需要为该角色制定好权限后,将相同权限的用户都指定为同一个角色即可,便于权限管理。
  • 对于批量的用户权限调整,只需调整用户关联的角色权限,无需对每一个用户都进行权限调整,既大幅提升权限调整的效率,又降低了漏调权限的概率。

这个模型中又包含了 2 种:

  1. 用户 和 角色 是多对一关系,即:一个用户只充当一种角色,一种角色可以有多个用户担当。

  2. 用户 和 角色 是多对多关系,即:一个用户可同时充当多种角色,一种角色可以有多个用户担当。

那么,什么时候该使用多对一的权限体系,什么时候又该使用多对多的权限体系呢?

  • 如果系统功能比较单一,使用人员较少,岗位权限相对清晰且确保不会出现兼岗的情况,此时可以考虑用多对一的权限体系。

  • 其余情况尽量使用多对多的权限体系,保证系统的可扩展性。如:张三既是行政,也负责财务工作,那张三就同时拥有行政和财务两个角色的权限。

# 应用示例

参考项目:ruoyi-vue-pro (opens new window),mysql 版

基于 RABC 权限模型,一共有 5 张表。

实体 表 说明
SysUser sys_user 用户信息表
SysRole sys_role 角色信息表
SysUserRole sys_user_role 用户和角色关联表
SysMenu sys_menu 菜单权限表
SysRoleMenu sys_role_menu 角色和菜单关联表

5 张表的关系比较简单:

  • 一个 SysUse ,可以拥有多个 SysRole ,通过 SysUserRole 存储关联。
  • 一个 SysRole ,可以拥有多个 SysMenu ,通过 SysRoleMenu 存储关联。

# 表结构设计

# sys_user(用户信息表)

-- 用户信息表
DROP TABLE IF EXISTS `system_users`;
CREATE TABLE `system_users`
(
    `id`         bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    `username`   varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL COMMENT '用户账号',
    `password`   varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码',
    `nickname`   varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL COMMENT '用户昵称',
    `remark`     varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT NULL COMMENT '备注',
    `dept_id`    bigint                                                        NULL     DEFAULT NULL COMMENT '部门ID',
    `post_ids`   varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT NULL COMMENT '岗位编号数组',
    `email`      varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NULL     DEFAULT '' COMMENT '用户邮箱',
    `mobile`     varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NULL     DEFAULT '' COMMENT '手机号码',
    `sex`        tinyint                                                       NULL     DEFAULT 0 COMMENT '用户性别',
    `avatar`     varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT '' COMMENT '头像地址',
    `status`     tinyint                                                       NOT NULL DEFAULT 0 COMMENT '帐号状态(0正常 1停用)',
    `login_ip`   varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NULL     DEFAULT '' COMMENT '最后登录IP',
    `login_date` datetime                                                      NULL     DEFAULT NULL COMMENT '最后登录时间',

    create_user  bigint                                                        null comment '创建人标识',
    create_time  datetime                                                               default CURRENT_TIMESTAMP not null comment '创建时间',
    update_user  bigint                                                        null comment '修改人标识',
    update_time  datetime                                                               default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
    is_deleted   tinyint                                                                default 0 not null comment '是否已删除 0=否,1=是(删除)',
    tenant_id    bigint                                                                 default 0 not null comment '租户编号',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_unicode_ci COMMENT = '用户信息表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

说明:

  • bit(1) 类型用于存储单个位(0 或 1)。
  • DEFAULT b'1':默认值 b'1' 是一个二进制字符串字面量,表示二进制的 1。

# sys_role(角色信息表)

-- 角色信息表
DROP TABLE IF EXISTS `system_role`;
CREATE TABLE `system_role`
(
    `id`                  bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '角色ID',
    `name`                varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL COMMENT '角色名称',
    `code`                varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色权限字符串,使用逗号分隔',
    `sort`                int                                                           NOT NULL COMMENT '显示顺序',
    `data_scope`          tinyint                                                       NOT NULL DEFAULT 1 COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
    `data_scope_dept_ids` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '数据范围(指定部门数组)',
    `status`              tinyint                                                       NOT NULL COMMENT '角色状态(0正常 1停用)',
    `type`                tinyint                                                       NOT NULL COMMENT '角色类型',
    `remark`              varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',

    create_user           bigint                                                        null comment '创建人标识',
    create_time           datetime default CURRENT_TIMESTAMP                            not null comment '创建时间',
    update_user           bigint                                                        null comment '修改人标识',
    update_time           datetime default CURRENT_TIMESTAMP                            not null on update CURRENT_TIMESTAMP comment '修改时间',
    is_deleted            tinyint  default 0                                            not null comment '是否已删除 0=否,1=是(删除)',
    tenant_id             bigint   default 0                                            not null comment '租户编号',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_unicode_ci COMMENT = '角色信息表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# sys_user_role(用户和角色关联表)

-- 用户和角色关联表
DROP TABLE IF EXISTS `system_user_role`;
CREATE TABLE `system_user_role`
(
    `id`        bigint                             NOT NULL AUTO_INCREMENT COMMENT '自增编号',
    `user_id`   bigint                             NOT NULL COMMENT '用户ID',
    `role_id`   bigint                             NOT NULL COMMENT '角色ID',

    create_user bigint                             null comment '创建人标识',
    create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    update_user bigint                             null comment '修改人标识',
    update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
    is_deleted  tinyint  default 0                 not null comment '是否已删除 0=否,1=是(删除)',
    tenant_id   bigint   default 0                 not null comment '租户编号',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_unicode_ci COMMENT = '用户和角色关联表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# sys_menu(菜单权限表)

-- 菜单权限表
DROP TABLE IF EXISTS `system_menu`;
CREATE TABLE `system_menu`
(
    `id`             bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
    `name`           varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci  NOT NULL COMMENT '菜单名称',
    `permission`     varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '权限标识,一般格式为 ${大模块}:${小模块}:{操作}',
    `type`           tinyint                                                       NOT NULL COMMENT '菜单类型(M目录 C菜单 F按钮)',
    `sort`           int                                                           NOT NULL DEFAULT 0 COMMENT '显示顺序',
    `parent_id`      bigint                                                        NOT NULL DEFAULT 0 COMMENT '父菜单ID',
    `path`           varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT '' COMMENT '路由地址',
    `icon`           varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT '#' COMMENT '菜单图标',
    `component`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT NULL COMMENT '组件路径',
    `component_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL     DEFAULT NULL COMMENT '组件名',
    `status`         tinyint                                                       NOT NULL DEFAULT 0 COMMENT '菜单状态',
    `visible`        bit(1)                                                        NOT NULL DEFAULT b'1' COMMENT '是否可见',
    `keep_alive`     bit(1)                                                        NOT NULL DEFAULT b'1' COMMENT '是否缓存',
    `always_show`    bit(1)                                                        NOT NULL DEFAULT b'1' COMMENT '是否总是显示',

    create_user      bigint                                                        null comment '创建人标识',
    create_time      datetime                                                               default CURRENT_TIMESTAMP not null comment '创建时间',
    update_user      bigint                                                        null comment '修改人标识',
    update_time      datetime                                                               default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
    is_deleted       tinyint                                                                default 0 not null comment '是否已删除 0=否,1=是(删除)',
    tenant_id        bigint                                                                 default 0 not null comment '租户编号',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_unicode_ci COMMENT = '菜单权限表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

说明:

  • 对于前端来说,每个按钮在展示时,可以判断用户是否有该按钮的权限。如果没有,则进行隐藏。当然,前端在首次进入系统的时候,会请求一次权限列表到本地进行缓存。
  • 对于后端来说,每个接口上会添加 @PreAuthorize("@ss.hasPermi('system:user:list')") 注解。在请求接口时,会校验用户是否有该 URL 对应的权限。如果没有,则会抛出权限验证失败的异常。
  • 一个 perms 属性,可以对应多个权限标识,使用逗号分隔。例如说:"system:user:query,system:user:add" 。

# sys_role_menu(角色和菜单关联表)

-- 角色和菜单关联表
DROP TABLE IF EXISTS `system_role_menu`;
CREATE TABLE `system_role_menu`
(
    `id`        bigint                             NOT NULL AUTO_INCREMENT COMMENT '自增编号',
    `role_id`   bigint                             NOT NULL COMMENT '角色ID',
    `menu_id`   bigint                             NOT NULL COMMENT '菜单ID',

    create_user bigint                             null comment '创建人标识',
    create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    update_user bigint                             null comment '修改人标识',
    update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间',
    is_deleted  tinyint  default 0                 not null comment '是否已删除 0=否,1=是(删除)',
    tenant_id   bigint   default 0                 not null comment '租户编号',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_unicode_ci COMMENT = '角色和菜单关联表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 学习参考

  • 芋道 Spring Boot 安全框架 Spring Security 入门 | 芋道源码 —— 纯源码解析博客 (iocoder.cn) (opens new window)
  • 到底什么是RBAC权限模型?!RBAC之知其然,却一直不知其所以然。 RBAC就是一个权限控制模型,这个模型是经过时间沉 - 掘金 (juejin.cn) (opens new window)
上次更新: 2025/3/14 17:32:11
UML类图
那些鉴权相关的知识

← UML类图 那些鉴权相关的知识→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式