从零开始搭建企业管理系统(六):RBAC 权限管理设计

RBAC 权限管理设计

    • 前言
    • 权限分类
    • 功能权限设计
      • 什么是 RBAC
      • RBAC 组成
      • RBAC 模型分类
        • 基本模型RBAC0
        • 角色分层模型RBAC1
        • 角色限制模型RBAC2
        • 统一模型RBAC3
      • RBAC0 权限设计
        • 用户管理
        • 角色管理
        • 权限管理
        • 关联表
    • 总结

前言

作为一个后台管理系统,权限管理是一个绕不开的话题,一个成熟的后端系统离不开一个比较完善的权限管理系统,所以本小结我们根据 RBAC 思想来设计一下我们这个系统的权限管理。

权限分类

一般来说,我们常说的权限分为两种,一种是功能权限,一种则是数据权限。

  • 功能权限指的是用户登录系统后能看到什么模块,能看到哪些页面。
  • 数据权限指的是用户在某个模块里面能够看到哪些数据。

在这里插入图片描述

本系统目前只进行功能权限的设计,数据权限默认进行管控,先最小化功能实现,后面有需求在迭代吧。

功能权限设计

目前业界有很多关于权限系统的技术模型,常见的有ACL、ABAC、DAC、RBAC等等,不同体量的权限系统,我们可以参考不同的权限模型进行梳理和设计,本系统就采用一个经典的 RBAC 权限系统模型,我接触的系统基本上都是使用的 RBAC 模型,能满足绝大部分的需求。

什么是 RBAC

RBAC 模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George Mason大学信息安全技术实验室(LIST)提出的RBAC96模型最具有代表,并得到了普遍的公认。

RBAC 认为权限授权的过程可以抽象地概括为:Who 是否可以对What进行How的访问操作,并对这个逻辑表达式进行判断是否为True的求解过程,也即是将权限问题转换为Who、What、How的问题,Who、What、How构成了访问权限三元组,具体的理论可以参考RBAC96。

RBAC的权限授权其实就是Who、What、How的问题。

  • Who:权限的拥用者
  • What:权限针对的资源
  • How:具体的权限

RBAC 组成

RBAC模型的三要素为:用户、角色、权限。

  • 用户:是发起操作的主体,例如:后台管理系统的用户、OA系统的内部员工、面向C端的用户。
  • 角色:用于连接了用户和权限的桥梁,每个角色可以关联多个权限,同时一个用户也可以关联多个角色,那么这个用户就有了多个角色的多个权限。
  • 权限:用户可以访问的资源,包括:页面权限、操作权限、数据权限。

RBAC 模型分类

本系统使用 RBAC0 作为权限设计的方案,够用以及容易学习。

在RBAC中,根据权限设计的复杂程度,可分为RBAC0、RBAC1、RBAC2、RBAC3,我们就重点了解一下我们需要使用到的 RBAC0 模型就行,另外几种有兴趣可以百度一下。

基本模型RBAC0

RBAC0是基础,很多产品只需基于RBAC0就可以搭建权限模型了。在这个模型中,我们把权限赋予角色,再把角色赋予用户。用户和角色,角色和权限都是多对多的关系。用户拥有的权限等于他所有的角色持有权限之和。

在这里插入图片描述

角色分层模型RBAC1

RBAC1建立在RBAC0基础之上,在角色中引入了继承的概念。简单理解就是,给角色可以分成几个等级,每个等级权限不同,从而实现更细粒度的权限管理。

角色限制模型RBAC2

RBAC2同样建立在RBAC0基础之上,仅是对用户、角色和权限三者之间增加了一些限制。这些限制可以分成两类,即静态职责分离SSD(Static Separation of Duty)和动态职责分离DSD(Dynamic Separation of Duty)。

统一模型RBAC3

RBAC3是RBAC1和RBAC2的合集,所以RBAC3既有角色分层,也包括可以增加各种限制。

RBAC0 权限设计

通过上述分析,我们可以发现,设计功能权限离不开最基本的三要素:用户管理、角色管理以及权限管理;根据业务的不同,可能还会涉及更复杂的三要素:部门管理、职位管理、菜单管理等,当然我们使用 RBAC0 只涉及到用简单的3要素。

在这里插入图片描述

用户管理

为了便于大家理解,我们先参考一个优秀的开源框架 EL-ADMIN,给大家截点图理解理解。

在这里插入图片描述

可以很清楚的看到页面上的功能,我们的页面完成之后应该都是差不多的,并且还有一个部门管理,我们也可以有部门管理,但是不加入权限继承。

用户表设计:

字段类型含义
idbigint主键ID
usernamevarchar用户名
mobilechar手机号
avatarvarchar头像
emailvarchar邮箱
passwordvarchar密码
statusint状态 1正常 2锁定
is_deletedatetime是否删除
last_login_timedatetime最后登录时间
create_timedatetime创建时间
create_uservarchar创建用户
update_timedatetime更新时间
update_uservarchar更新用户
角色管理

在这里插入图片描述

上面说了我们的系统暂时是没有数据权限的实现的。

角色表设计:

字段类型含义
idbigint主键ID
namevarchar角色名称
remarkvarchar备注
statusint状态 1正常 2锁定
is_deletedatetime是否删除
create_timedatetime创建时间
create_uservarchar创建用户
update_timedatetime更新时间
update_uservarchar更新用户
权限管理

在这里插入图片描述

权限表设计:

字段类型含义
idbigint主键ID
pidbigint父菜单ID,一级菜单为0
namevarchar菜单名称
urlvarchar菜单URL
permsvarchar授权(多个用逗号分隔,如:user:list,user:create)
typeint类型 0:目录 1:菜单 2:按钮
iconvarchar菜单图标
orderint排序
statusint状态
is_deletedatetime是否删除
create_timedatetime创建时间
create_uservarchar创建用户
update_timedatetime更新时间
update_uservarchar更新用户
关联表

还有两张关联表需要设计,这两张表非常的简单,只有两个字段,分别是两个关联表的id,并且这两个字段都需要设置外键。

用户角色关联表

字段类型含义
user_idbigint用户ID(需要设置外键)
role_idbigint角色ID(需要设置外键)

角色权限关联表

字段类型含义
role_idbigint角色ID(需要设置外键)
menu_idbigint权限ID(需要设置外键)

ok,关于表的设计到这里就结束了,先简单的定了一个基础版本,后续根据开发需求慢慢的在维护修改吧。

总结

关于权限设计这一块,我们采用了 RBAC0 模型来实现,基本上中小型企业都是够用的了。而且简单易上手,学习难度不大,非常适合我们学习,下一小节我们使用 Spring Security 来编写具体的代码实现登录和授权功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频剪辑:视频创意制作,背景图片融合视频制作画中画效果

随着社交媒体的兴起,视频制作不再仅仅是专业人士的专利。每个人都可以通过一些技巧,创作出独特而富有吸引力的视频内容。视频剪辑是一种非常重要的技术,它能让视频从平淡无奇变为生动有趣。背景图片融合视频制作画中画效果,也能增…

springboot利用easyexcel在浏览器中下载excel

前言 项目中操作excel是一种很常用的功能,比如下载一份excel的报价单。这篇文章会介绍一款excel的处理工具以及导出遇到的三个常见异常(重要)。 之前遇到一个这样的需求:后台管理页面,点击下载按钮,下载一份excel格式的报价清单…

《人工智能导论》知识思维导图梳理【1~5章节】

文章目录 说明第一章 绪论人工只能概述 第二章 知识表示和知识图谱一阶谓词逻辑和知识表示法产生式表示和框架表示法 第三章 确定性推理方法推理的基本概念自然演绎推理归结演绎推理谓词公式化子句集鲁宾孙归结原理归结反演归结反演求解问题 第四章 不确定性推理方法似然推理可…

npm run build时提示vue/types/jsx.d.ts中的错误

解决方法一: 可能是因为vue版本过高引起的 我直接将package.json中vue以及vue-template-compiler的版本的前面^去掉,安装指定的版本 注意:vue和vue-template-compiler需要版本一致 参考链接:链接 解决方法二: 如果如…

QT使用SQLite 超详细(增删改查、包括对大量数据快速存储和更新)

QTSQLite 在QT中使用sqlite数据库,有多种使用方法,在这里我只提供几种简单,代码简短的方法,包括一些特殊字符处理。在这里也给大家说明一下,如果你每次要存储的数据量很大,建议使用事务(代码中…

canvas 有趣的弹簧效果

先上效果 两个小球之间有一根弹簧,这里有一条线表示,其中左球固定,在点击开始后,右球开始做自由落体 思路 先做受力分析 经过受力分析可以发现,整个系统一共有三个力在起作用,我们分别把他们求出来并合成…

控制台打印如来佛图像

代码 System.out.println(" _ooOoo_ \n"" o8888888o \n"" 88 \".\" 88 …

python——第十七天

方法重写(overwrite) 、方法覆盖(override ):在继承的基础上,子类继承了父类的方法,如果不能满足自己使用,我们就可以重写或覆盖该方法 函数重载(overload): 在强数据类型的编程语言中(如Java、C、C等等): 函数名称…

PDI/Kettle-9.4.0.0-343源码下载及编译

目录 🍑一、概要🍊最新版本10.x(2023-11-30) 🍑二、下载🍑三、编译🍊3.1、导入开发工具🍊3.2、开始编译🍊3.3、编译报错🍊3.4、报错原因:jdk版本低…

centos7安全防护_CPU占用率超过百分之300_centos7.4中毒CPU百分之百_清理毒源---Linux工作笔记068

执行top命令的时候看到有个进程: sshd占用cpu百分之300多...而且就算是kill -9 杀掉进程以后,进程又会自动启动 ll /proc/7298 我们执行这个命令,可以看到有个/var/tmp/sshd的文件 我们进入cd /var/tmp 然后我们执行 rm -rf sshd删除这个文件,然后我们再去top可以看到 cpu就…

【数仓理论】

一、数仓建模方法论 1.1 ER模型(Entity Relationship、实体关系模型、范式模型) ER模型是Bill Inmon提出的一种建模方法,实体关系模型将复杂的数据抽象为两个概念 ---- 实体和关系 该模型在范式理论上符合3NF,这种模型目的是减少…

测距传感器

测距传感器 电子元器件百科 文章目录 测距传感器前言一、测距传感器是什么二、测距传感器的类别三、测距传感器的应用实例四、测距传感器的作用原理总结前言 测距传感器广泛应用于自动化控制、机器人导航、无人驾驶、测量仪器等领域。不同类型的测距传感器具有不同的测距范围、…

重磅!2023中国高校计算机大赛-人工智能创意赛结果出炉

目录 中国计算机大赛-人工智能创意赛现场C4-AI大赛颁奖及留影800个AI应用?这届大学生真能“搞事情”AI原生时代,百度要再培养500万大模型人才 中国计算机大赛-人工智能创意赛现场 12月8日,杭州,一位“白发老人”突然摔倒在地&…

[基础IO]文件描述符{C库函数\系统接口\初识fd}

文章目录 1.基础知识1.1对文件的认识1.2对系统调用接口的认识1.3如何理解LInux下一切皆文件? 2.C语言的库函数2.1FILE *fopen(const char *path, const char *mode);2.2对fopen()的mode的w/a的深层认识2.3fclose()2.4size_t fwrite(const void *ptr, size_t size, size_t nmem…

【桌面应用开发】Tauri是什么?基于Rust的桌面应用

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

深入.NET平台和C#编程总结大全

第一章 简单认识.NET框架 (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework Class Library) 配图: (…

Java - JVM内存区域的划分

Java 程序运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 分配:通过关键字new创建对象分配内存空间,对象存在堆中。 释放 &…

柔性数组详解

前言:柔性数组是C99中新添加的概念,它是结构体里面的最后一个成员,因为它的大小未知,所以很灵活,称之为柔 1 柔性数组占不占结构体的空间呢? 不占 typedef struct Stu {char y;int x;int arr[];//有些编译器…

数据在内存中的存储(整型篇)

1.辨析原码反码补码: 1.原码:有32位(int类四个字节,一个字节八个比特位),第一位是符号位,0正1负,其余为二进制位。 2.计算一般是对原码进行计算,但在负数计算使用原码会导…

高效利用内存资源之动态内存管理详解

目录 一、为什么存在动态内存分配 二、动态内存函数的介绍 2.1malloc 2.2free 2.3calloc 2.4realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free释放 3.4使用free释放一块动态开辟内存的一部分 3.…