深入理解RBAC权限系统

最近,一位朋友在面试中被问及如何设计一个权限系统。我们注意到目前许多后台管理系统(包括一些热门的如若依快速开发平台)都采用了RBAC访问控制策略。该策略通过将权限授予角色,然后将角色分配给用户,从而实现对系统资源的访问控制。今天,我们将详细解释基于RBAC的权限系统。

RBAC-SYS.jpg

RBAC描述

RBAC(Role-Based Access Control)是一种访问控制模型,其核心概念是基于角色的权限分配。该模型的设计目标是简化对系统资源的访问管理,提高系统的安全性和可维护性。

RBAC的实现通常包括以下步骤:

  • 设计角色和权限的层次结构。
  • 将用户分配到合适的角色。
  • 关联权限到角色,形成访问控制矩阵。
  • 通过会话管理机制维护权限的有效性。


RBAC-MODULE.png

以下是RBAC权限系统的一些描述:

角色定义

在RBAC系统中,角色是一组相互关联的权限的集合。角色可以代表用户的职能、职位或责任。例如,系统管理员、普通用户、审计员等都可以是角色。在一些企业中权限系统中,他们采用的三权分立的权限体系,就是通过角色和用户的类型来控制的。

权限定义

权限表示对系统资源或操作的访问权力,包括不同级别的访问,如读、写、执行等操作。通常,权限与具体任务或操作相关联,例如访问特定文件、修改用户信息等。在我们的权限系统中,权限的粒度一般细化到页面上的操作按钮级别。一些系统还包含数据权限,例如可以访问当前部门及其下级部门的数据,或者只能查看特定系统的数据等。

角色分配

用户通过被分配到一个或多个角色而获得相应的权限。这使得权限管理更加简化,因为不再需要为每个用户直接分配权限,而只需管理角色与权限的关系。

权限关联

每个角色都与特定的权限相关联。这意味着当用户被分配到某个角色时,他们将自动拥有该角色所关联的权限。这种关联可以通过访问控制矩阵或类似的结构来实现。

会话管理

用户登录系统后,会话管理机制负责维护用户与其角色相关联的权限。一旦会话结束,通常会触发权限的自动撤销。我们通常采用将会话存储到Redis中,并设置过期时间的方式来管理会话。用户在访问时会刷新过期时间,确保会话的有效性。

审计和监控

RBAC系统通常包括审计和监控功能,以便记录用户活动、权限变更和系统访问情况。这有助于检测潜在的安全问题和确保合规性。

动态调整:

RBAC系统允许在运行时动态调整角色和权限的关联关系。这种灵活性使得系统能够适应不断变化的组织结构和业务需求。

RBAC的特点

  • 简化管理

通过将权限关联到角色,RBAC简化了大规模用户权限管理的复杂性。

  • 灵活性

RBAC模型具有较强的灵活性,可以根据组织需求调整角色和权限的关联关系。

  • 降低错误

通过减少直接分配权限给用户的操作,RBAC降低了由于错误授权导致的系统安全风险。

数据库表设计

数据库表ER图如下:

RBAC-ER.png

具体表设计如下:

sys_menu

表注释: 菜单权限表

字段类型默认注释
id (主键)bigint菜单ID
menu_namevarchar(50)NULL菜单名称
parent_idbigint0父菜单ID
order_numint0显示顺序
pathvarchar(200)路由地址
componentvarchar(255)NULL组件路径
queryvarchar(255)NULL路由参数
is_frameint1是否为外链(0是 1否)
menu_typechar(1)菜单类型(M目录 C菜单 F按钮)
visiblechar(1)0菜单状态(0显示 1隐藏)
statuschar(1)0菜单状态(0正常 1停用)
permsvarchar(100)NULL权限标识
iconvarchar(100)#菜单图标
create_byvarchar(64)创建者
create_timedatetimeNULL创建时间
update_byvarchar(64)更新者
update_timedatetimeNULL更新时间
remarkvarchar(500)备注

sys_role

表注释: 角色信息表

字段类型默认注释
id (主键)bigint角色ID
role_namevarchar(30)NULL角色名称
role_keyvarchar(100)NULL角色权限字符串
statuschar(1)NULL角色状态(0正常 1停用)
del_flagchar(1)0删除标志(0代表存在 2代表删除)
create_byvarchar(64)创建者
create_timedatetimeNULL创建时间
update_byvarchar(64)更新者
update_timedatetimeNULL更新时间
remarkvarchar(500)NULL备注

sys_role_menu

表注释: 角色和菜单关联表

字段类型默认注释
id (主键)bigint
role_idbigintNULL角色ID
menu_idbigintNULL菜单ID

sys_user

表注释: 用户信息表

字段类型默认注释
id (主键)bigint用户ID
user_namevarchar(30)NULL用户账号
nick_namevarchar(30)NULL用户昵称
phonenumbervarchar(11)手机号码
passwordvarchar(100)密码
statuschar(1)0帐号状态(0正常 1停用)
del_flagchar(1)0删除标志(0代表存在 2代表删除)
create_byvarchar(64)创建者
create_timedatetimeNULL创建时间
update_byvarchar(64)更新者
update_timedatetimeNULL更新时间
remarkvarchar(500)NULL备注

sys_user_role

表注释: 用户和角色关联表

字段类型默认注释
id (主键)bigint主键ID
user_idbigintNULL用户ID
role_idbigintNULL角色ID

sys_logininfor

表注释: 系统登录日志表

字段类型默认注释
id (主键)bigint访问ID
user_idbigintNULL用户id
user_namevarchar(50)用户账号
ipaddrvarchar(128)登录IP地址
login_locationvarchar(255)登录地点
browservarchar(50)浏览器类型
osvarchar(50)操作系统
statuschar(1)0登录状态(0成功 1失败)
msgvarchar(255)提示消息
login_timedatetimeNULL访问时间

总结

RBAC权限系统作为一种可靠而强大的访问控制机制,为系统安全提供了坚实的基础。通过深入理解RBAC的核心概念和工作原理,我们可以更好地应用该模型,确保系统在访问控制方面达到最佳性能,同时提高系统的可维护性和灵活性。一些系统在基于RBAC角色系统的基础上引入了临时角色、基础角色等功能,以进一步完善RBAC的灵活性和适应性。

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

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

相关文章

推荐一个FL Studio最适配的midi键盘?

Hello大家好!好消息!好消息!特大好消息! 水果党们!终于有属于自己的专用MIDI键盘啦! 万众期待的Novation FLKEY系列 正式出炉! 做编曲和音乐制作的朋友们,对水果软件FLSTUDIO应该…

mysql开启查询日志

mysql默认不开启查询日志,可以通过命令查询 show VARIABLES LIKE general%; 开启查询日志,并更改日志存放目录,不过存放的目录一定要有权限不然会报错 手动创建一下log目录下的mysql目录并赋予权限 mkdir /var/log/mysql chown -R mysql:m…

在vue3的js中将一组数据赋值的问题

代码: if (res.data) { myPrizeList.value res.data console.log(myPrizeList.value,myPrizeList.value) const giftList ref() console.log(JSON.parse(JSON.stringify(myPrizeList.val…

【计算机网络】URL概念及组成

目录 一、什么是URL 二、URL格式 示例: 1. Scheme(协议): 2. Host(主机): 3. Port(端口): 4. Path(路径): 5. Quer…

二叉树--基础OJ

1.对称二叉树 题目链接:101. 对称二叉树 - 力扣(LeetCode) 题解: 我们可以用递归的方法去做: 如果两个树互为镜像(1.根节点的值相同,2.左子树的值与右子树的值对称)则为对称二叉树&a…

Vue--第八天

Vue3 1.优点&#xff1a; 2.创建&#xff1a; 3.文件&#xff1a; 换运行插件&#xff1a; 4.运行&#xff1a; setup函数&#xff1a; setup函数中获取不到this&#xff08;this 在定义的时候是Undefined) reactive()和ref(): 代码&#xff1a; <script setup> // …

数字孪生技术的应用场景

数字孪生技术具有广泛的应用场景&#xff0c;涉及多个行业和领域。以下是一些数字孪生的常见应用场景&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.制造业优化&#xff1a; 数字孪生可用于建模和…

易基因:MeRIP-seq等揭示m6A RNA甲基化以ABA依赖性方式调控草莓果实成熟 | 作物育种

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 DNA甲基化等表观遗传标记在调控不同成熟阶段果实成熟中起着关键作用。m6A甲基化已被证明可以调控番茄成熟&#xff0c;但目前尚不清楚 mRNA m6A甲基化是否对不同类型水果的成熟调控具有功…

快速入门Tailwind CSS:从零开始构建现代化界面

快速入门Tailwind CSS&#xff1a;从零开始构建现代化界面 介绍 Tailwind CSS 是一个以原子类的方式快速构建界面的 CSS 框架。它提供了丰富的预定义类&#xff0c;使得开发者能够快速构建样式和布局。 安装和设置 首先&#xff0c;我们需要在项目中安装 Tailwind CSS。可以…

linux应用层编程问题--沙雕问题

1.调用沁恒 USB读取接口 读不到数据 static bool CH37XASyncReadData(int iIndex, uint32_t epindex, void *oBuffer, uint32_t *ioLength) {struct _bulkUp {uint32_t len;uint8_t epindex;uint8_t data[0];} __attribute__((packed));struct _bulkUp *bulkUp;int retval;bul…

gitlab动态流水线

文章目录 1. 说明2. 官方样例2.1 在作业中生成配置文件&#xff0c;保存为产物2.2 将触发器作业配置为在生成配置文件的作业之后运行。 3. 实战应用3.1 背景介绍3.2 项目介绍3.3 公共项目配置3.4 测试项目配置3.5 测试 4. 总结 1. 说明 顾名思义&#xff0c;动态流水线就是一种…

Shell函数数组练习

1、编写函数&#xff0c;实现打印绿色OK和红色FAILED&#xff0c;判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED [rootshell ~]# vim ok.sh #!/bin/bash read -p "请输入一个参数:" i function ok…

mac 安装nvm以及切换node版本详细步骤

1、nvm介绍&#xff08;node版本管理工具&#xff09; nvm 可以让你通过命令行快速安装和使用不同版本的node 有时候项目太老&#xff0c;node版本太高,执行npm install命令会报错,可以借助nvm切换低版本的node。 2、安装nvm 在终端执行安装命令 curl -o- https://raw.gith…

后端只打印了info等级的日志?-SpringBoot日志打印-Slf4j

在调用log变量的方法来输出日志时&#xff0c;有以上5个级别对应的方法&#xff0c;从不太重要&#xff0c;到非常重要 调用不同的方法&#xff0c;就会输出不同级别的日志。 trace&#xff1a;跟踪信息debug&#xff1a;调试信息info&#xff1a;一般信息warn&#xff1a;警告…

1、混合方式UI设计

1、混合方式UI设计 新建项目添加静态资源添加资源添加action添加菜单菜单栏工具栏中间编辑区域 代码添加其他组件字体和大小状态栏 添加槽函数UI设置的转到槽的手写的设置应用程序图标 代码 新建项目 MainWindow代码文件夹主窗口为 (QMainWindow) 添加静态资源 AppIcon.icoi…

scikit-learn-feature_selection

参考&#xff1a; Feature selection 1. 移除低方差的特征 方差低&#xff0c;说明变化不大。 将特征方差值小于一定值的特征移除 单变量特征分析 通过单特征分析&#xff0c;选择最好的&#xff08;前k个&#xff09;的特征&#xff0c;scikit-learn 提供的方法有&#x…

基于JAVA+SpringBoot+Vue的前后端分离的旅游网站

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 近年来&#xff0c;随…

IntelliJ IDEA 自带的 HTTP Client接口调用插件,替代 Postman

文章目录 引言建议目录结构新建请求不同环境的变量配置添加环境http-client.env.jsonhttp-client.private.env.json引用变量 请求示例Get请求示例Post请求示例鉴权示例断言示例Websocket请求示例 内置对象和动态变量内置对象&#xff1a;内置变量&#xff1a; 引言 在日常的 W…

关于引用unpkg.com的mars3d相关依赖文件报错无法请求的说明

问题来源&#xff1a; 1.关于引用unpkg.com的mars3d相关依赖文件报错无法请求的说明 说明&#xff1a; 1.最近npm、unpkeg都访问异常&#xff0c;可能是unpkg.com等国外的服务器不稳定导致的请求未响应。 解决方案&#xff1a; 1.请切换静态文件引入的方式请求相关资源。参…

LaTex:如何在数学环境下打出大的右括号“}“

一般来说多行公式打左大括号都知道使用语法"cases" \begin{cases} foo\\ foo\\ \end{cases}最近需要键入右边大花括号括起来公式的时候犯难了&#xff0c;搜了很多用的都是"\left.array\right}"&#xff0c;看得我昏迷&#xff0c;屡屡报错。 突然想起很久…