lnmp - RBAC方案设计与实现

news2024/11/29 20:36:57

概述

实践的是一套企业内部使用后台OA管理系统,对这套系统设计的RBAC(Role-Based Access Control,基于角色的访问控制),RBAC 方案旨在通过将后台用户与角色进行关联,再将角色与权限进行关联,实现对系统资源的灵活、高效和安全的访问控制。

这种方式可以大大简化权限管理的复杂性,提高系统的可维护性和安全性。

关键概念

在看方案设计之前,有几个关键概念需要理解:

  • 后台用户(admin):台管理系统(OA)的使用者,为了区分C端用户,把这里的概念定义为后台用户。
  • 角色(Role):一组特定的权限集合,代表了特定的工作职责或功能,同一个用户可以分配多个角色,角色不同,职能也不同。
  • 权限(Permission):对系统资源的具体操作许可,如查看、编辑、删除、添加等,权限可以针对不同的功能模块或数据对象进行设置,也就是Node节点。
  • 组织架构(Department):所有的后台管理系统(OA)都是有组织架构,也就是部门,所有的部门负责人对所属子部门进行管理。

工作原理

在这里插入图片描述

1、首先,在系统中定义各种角色,比如并为每个角色分配相应的权限,根据职能角色有销售、客服、财务、工程师等角色。
2、给角色分配对应的权限,比如销售角色有添加客户、查看自己或自己部门销售的客户。
3、将用户分配到特定的角色,比如创建stark张宇 这个用户时,分配给stark张宇后端开发工程师的角色,一个用户也可以同时分为多个角色,角色和用户是多对多的关系。
4、当后台用户登录系统后,系统获取当前用户的角色,如果是多角色,在登录时进行选择即可。
5、Node节点仅对有权限的角色进行可见和对应操作。

注意事项

1、权限的分配应遵循最小权限原则,即只给予用户完成其工作所需的最小权限。
2、定期审查用户的权限,确保权限的合理性和安全性。
3、在系统升级或功能调整时,及时检查和更新权限设置,以防止出现权限漏洞。

数据库设计

RBAC的数据库设计最主要的记录就是以下5个数据表实现,重点叙述一下用户角色关系表 admin_roles,把用户stark张宇设置成为多个角色,是一个多对多的关系,在操作数据时使用事务操作,来保证数据的原子性和一致性,系统中设置先设置菜单,生成菜单的节点,对角色直接操作,不作用在用户上,用角色分离后台用户和权限。

1、后台用户表 admin

CREATE TABLE `admin` (
  `admin_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '真实姓名',
  `account` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '账号:即手机号',
  `idcard` varchar(18) NOT NULL DEFAULT '',
  `birth` int(8) NOT NULL DEFAULT '0' COMMENT '生日',
  `gender` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '性别 1男2女',
  `password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
  `department_id` int(10) NOT NULL DEFAULT '0' COMMENT '部门ID',
  `current_role_id` tinyint(1) NOT NULL COMMENT '当前角色',
  `master_uid` tinyint(3) unsigned NOT NULL COMMENT '是否负责人 0-否',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1正常 2禁用 3删除',
  `position` varchar(128) NOT NULL DEFAULT '' COMMENT '职务',
  `public_openid` char(28) NOT NULL DEFAULT '' COMMENT '公众号openid',
  `organ_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '所属机构主键ID',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
  `create_admin_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建后台用户ID',
  `create_admin_name` varchar(255) NOT NULL DEFAULT '' COMMENT '创建后台用户名称',
  `update_time` int(10) NOT NULL DEFAULT '0' COMMENT '更新时间',
  `update_admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '最后更新后台用户ID',
  `update_admin_name` varchar(255) NOT NULL DEFAULT '' COMMENT '最后更新后台用户姓名',
  PRIMARY KEY (`admin_id`) USING BTREE,
  KEY `account` (`account`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

2、角色表 role

CREATE TABLE `role` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(64) NOT NULL DEFAULT '' COMMENT '角色名称',
  `organ_id` tinyint(11) NOT NULL DEFAULT '0' COMMENT '机构ID',
  `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 1正常 2删除',
  `show` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '是否显示 1:是 2:否',
  `create_time` int(11) NOT NULL DEFAULT '0',
  `create_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '创建人ID',
  `create_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人姓名',
  `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后更新时间',
  `update_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '更新人ID',
  `update_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '更新人姓名',
  PRIMARY KEY (`role_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

3、用户角色关系表 admin_roles

CREATE TABLE `admin_roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
  `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色ID',
  `organ_id` int(11) unsigned NOT NULL DEFAULT '0',
  `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 1正常 2删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户角色关系表';

4、菜单表

CREATE TABLE `menu` (
  `node_id` int(11) NOT NULL AUTO_INCREMENT,
  `node_name` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单名称',
  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID',
  `node_route` varchar(600) NOT NULL DEFAULT '' COMMENT '路由Url',
  `node_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '菜单类型 1菜单 2按钮',
  `node_order` smallint(6) NOT NULL DEFAULT '0' COMMENT '顺序',
  `node_status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 1正常 2删除',
  `node_show` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '是否显示 1:是 2:否',
  `icon_url` varchar(500) NOT NULL DEFAULT '' COMMENT '图标url',
  `organ_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '机构主键ID',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `create_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '创建人ID',
  `create_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人姓名',
  `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后更新时间',
  `update_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '更新人ID',
  `update_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '更新人姓名',
  PRIMARY KEY (`node_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

5、角色菜单关系表

CREATE TABLE `role_menus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` int(11) DEFAULT '0' COMMENT '角色ID',
  `node_id` int(11) DEFAULT '0' COMMENT '菜单ID',
  `status` tinyint(2) DEFAULT '1' COMMENT '状态 1正常 2删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关系表';

最后

所有的方案设计都是循序渐进,先完成再完美,有和我同道的朋友可以私信我,大家一起学习一起加油。

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

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

相关文章

力扣之607.销售员

文章目录 1. 607.销售员1.1 题目说明1.2 准备数据1.3 解法1.4 结果截图 1. 607.销售员 1.1 题目说明 表: SalesPerson ------------------------ | Column Name | Type | ------------------------ | sales_id | int | | name | varchar | | salary | int | | commission_ra…

【CURL命令】命令行或脚本进行API测试

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 【CURL命令】命令行或脚本进行API测试 简介使用…

InfiniiVision HD3 系列示波器

_XLT_ InfiniiVision HD3 系列示波器 苏州新利通仪器仪表 使用带有定制专用集成电路 (ASIC) 的便携式示波器执行数字调试,该电路提供的垂直分辨率是其他通用示波器的四倍,注入噪声是其他通用示波器的一半。使用示波器进行调试&…

canvas:绘制点和点之间连线

效果图&#xff1a; <template><div class"home-box"><canvas id"canvas" /><div class"lightCircle" ref"circleRef" v-for"(item,index) in 5" :key"index"></div><div cla…

makefile与gdb的使用

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2024年10月11日 &#x1f4e8; 博主码云地址&#xff1a;渣渣C &#x1f4d5;参考书籍&#xff1a…

vue 解决高德地图Uncaught Error: Invalid Object: Pixel(NaN, NaN)

有点啰嗦&#xff0c;可以直接跳到最后看解决方法。 问题排查过程 原因起始于一个新需求&#xff1a;在编辑列表信息时需要修改设备位置。 按照文档一番操作&#xff0c;发现完美需求解决了。后续测试的时候就发现浏览器报错Uncaught Error: Invalid Object: Pixel(NaN, NaN)…

在 Notebook 中启动 FastAPI

如何在 Notebook 使用 FastAPI 对外提供 RestAPI&#xff0c;当我们测试完模型时&#xff0c;有事需要对外提供 API 进行测试。FastAPI 是 Python 中快速提供 Rest API 的框架&#xff0c;本文将对外实现一个 OCR 的图片转文字的服务。 OCR 服务 本文使用 GOT OCR 提供 OCR 识…

[Git] Git下载及使用 从入门到精通 详解(附下载链接)

前言 目录 Git概述 简介 下载 Git代码托管服务 Git常用命令 Git全局配置 获取Git仓库 在本地初始化一个Git仓库 从远程仓库克隆 基本概念 工作区文件状态 本地仓库操作 远程仓库操作 分支操作 标签操作 在IDEA中使用Git 在IDEA中配置Git 本地仓库操作 远程仓…

【unity框架开发7】对象池的使用,如何封装一个对象池管理器

文章目录 什么是对象池&#xff1f;对象池有什么用&#xff1f;对象池的原理对象池的实现1、从对象池获取对象2、回收对象3、回收所有对象4、预先往这个对象池中加载指定数量的游戏对象5、最终代码 封装对象池管理器1、对象池管理器代码2、测试调用3、生成和回收游戏对象时自动…

LLM基础常见面试题

#############【持续更新】############## LLM基础常见面试题 简单介绍一下大语言模型【LLMs】&#xff1f; 大模型&#xff1a;一般指1亿以上参数的模型&#xff0c;但是这个标准一直在升级&#xff0c;目前万亿参数以上的模型也有了。大语言模型&#xff08;Large Languag…

在 Windows 11 安卓子系统中安装 APK 的操作指南

这个软件好像不可以在纯android系统中使用&#xff08;不知道是缺了什么&#xff09;&#xff0c;其他对于android的虚拟机要不缺少必要功能组件&#xff0c;要不性能过于低下。本方法致力于在带有谷歌框架WSA中运行该APK 在 Windows 11 安卓子系统中安装 APK 的操作指南 本指…

渗透测试系列之靶机渗透

Helpline是一个困难的靶机&#xff0c;知识点涉及EFS解密和ME SDP的多个漏洞&#xff0c;包括XXE漏洞、LFI\任意文件下载漏洞、身份认证绕过漏洞以及远程代码执行漏洞等. 通关思维导图 0x01 侦查 端口探测 首先使用nmap进行端口扫描 nmap -Pn -p- -sV -sC -A 10.10.10.13…

Obsidian复制代码块代码正确方式

最近在用obsidain做笔记&#xff0c;整体使用下来感觉不错&#xff0c;尤其是强大的检索功能&#xff0c;但是刚才使用其内置的复制代码块功能时&#xff0c;却被恶心到了。 现有背景是&#xff1a;我有一个pydantic的 code block&#xff0c;编辑器处于编辑模式如下&#xff…

Visual Studio的实用调试技巧总结

对于很多学习编程的老铁们来说&#xff0c;是不是也像下面这张图一样写代码呢&#xff1f; 那当我们这样编写代码的时候遇到了问题&#xff1f;大家又是怎么排查问题的呢&#xff1f;是不是也像下面这张图一样&#xff0c;毫无目的的一遍遍尝试呢&#xff1f; 这篇文章我就以 V…

【C语言】深入理解指针(二)(上)

本篇博客将讲解的知识&#xff1a; &#xff08;1&#xff09;指针的使用和传址调用 &#xff08;2&#xff09;数组名的理解 1、指针的使用和传址调用 &#xff08;1&#xff09;strlen 的模拟实现 库函数strlen的功能是求字符串的长度&#xff0c;统计的是字符串中‘\0’之…

onnx代码解读

一、定义 torch.jit.trace 相关代码解读onnx 内部实现 3 查看是否为aten 算子aten 算子实现torch.autograd.Functions 算子实现自定义算子实现查找未实现的节点一次性发现所有的未实现 aten 算子 二、实现 torch.jit.trace 相关代码解读 1. torch.jit.script() : 将其转换为…

数据库的基本概念、安装MySQL及基础运用

目录 一、数据库的基本概念 1. 使用数据库的必要性 2. 数据&#xff08;Data&#xff09; 3. 表 4. 数据库 5. 数据库管理系统&#xff08;DBMS&#xff09; 6. 数据库管理系统DBMS的优点 7. 使用数据库的必要性总结 8. 访问数据库的流程 二、数据库发展及基本功能 1.…

宠物空气净化器怎么选?希喂、霍尼韦尔、美的宠物哪款除毛好?

身为养宠五年的资深铲屎官&#xff0c;最近收到了很多新手养宠朋友关于宠物空气净化器的挑选疑问。宠物空气净化器作为宠物领域目前最火热的产品&#xff0c;谈论度一直很高&#xff0c;评价也褒贬不一。双十一购物节又即将到来&#xff0c;大家都想赶上这一波优惠活动。 铺天盖…

Automa插件之js脚本小技巧:零依赖的日期时间格式化,亲测好用!

背景 在使用 Automa 插件自动下载文件时,有时候需要根据当前时间重新命名文件,如果是时间戳的话倒是也可以防重复文件命名,只不过那样的话,没有了时间可读性. 所以需要日期时间格式化,分享一个一直在用的纯 js 格式化日期脚本,可实现简单的日期格式化. 文末附完整代码,直接复制…

时序约束进阶四:set_input_delay和set_output_delay详解

目录 一、前言 二、set_input_delay/set_output_delay 2.1 延时约束 2.2 约束设置界面 2.3 示例工程 2.4 Delay Value 2.5 Delay value is relative to clock edge 2.6 Delay value already includes latencies of the specified clock edge 2.7 Rise/Fall 2.8 Max/M…