当前位置: 首页 > news >正文

系统架构设计-权限模块的设计

系统架构-权限模块的设计

如何评估一个研发人员技术水平,在大部分的情况下不是看其完成业务代码的好坏,更多的时候还是需要看这个研发人员从零构建一个完整项目的能力,在大公司中这样的机会可能相对较少,大部分的时间里都是对现有项目业务的小修小改,如果不跳出这样的环境,日积月累基本可以说沦为了一个螺丝钉式的业务工程师。相反中小厂能够提供研发人员发挥的空间更大,从某种程度上而言在失去大厂成熟的基建支持环境后,更能考验一个工程师的技术功底。在有过一些实际的项目经验之后,我们可以清晰的认识到,绝大部分的项目由于业务场景的不同,业务模块存在很大的变数,但同时一些模块大部分的系统中都是通用的,比如接下来我们将讨论基于rbac的权限模块,而权限模块又可以划分为三个小的功能模块:用户模块、角色模块、菜单模块。

rbac模型是什么?

rbac全称:Role-Based Access Control(基于角色的权限控制系统),核心在于用户只和角色关联,而角色代表对了权限,是一系列权限的集合。rbac的三要素:

用户:系统中的用户
角色:一系列权限的集合
权限:菜单、按钮、菜单的增删改查权限。

RBAC 模型可以分为:RBAC0、RBAC1、RBAC2、RBAC3 四个阶段,一般公司使用 RBAC0 的模型就可以。另外,RBAC0 相当于底层逻辑,后三者都是在 RBAC0 模型上的拔高。

rbac0

用户和角色、角色和权限多对多关系。简单来说就是一个用户拥有多个角色,一个角色可以被多个用户拥有,这是用户和角色的多对多关系;同样的,角色和权限也是如此。

rbac1

相对于 RBAC0 模型,增加了角色分级的逻辑,类似于树形结构,下一节点继承上一节点的所有权限,如 role1 根节点下有 role1.1 和 role1.2 两个子节点

rbac2

如角色互斥,比较经典的案例是财务系统中出纳不得兼管稽核,那么在赋予财务系统操作人员角色时,同一个操作员不能同时拥有出纳和稽核两个角色。如角色数量限制,例如:一个角色专门为公司 CEO 创建的,最后发现公司有 10 个人拥有 CEO 角色,一个公司有 10 个 CEO?这就是对角色数量的限制,它指的是有多少用户能拥有这个角色。RBAC2 模型主要是为了增加角色赋予的限制条件,这也符合权限系统的目标:权责明确,系统使用安全、保密。

rbac3

同样是基于 RBAC0 模型,但是综合了 RBAC1 和 RBAC2 的所有特点。

数据库设计

CREATE DATABASE IF NOT EXISTS sys_rbac CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `sys_user` 
(`id`                  BIGINT UNSIGNED NOT NULL              AUTO_INCREMENT COMMENT '自增PK',`username`            VARCHAR(50)     NOT NULL              COMMENT '用户名',`enable`              TINYINT(1)      NOT NULL              COMMENT '状态:1正常 2禁用',`created_at`          BIGINT UNSIGNED NOT NULL              COMMENT '创建时间',`updated_at`          BIGINT UNSIGNED NOT NULL              COMMENT '更新时间',`deleted_at`          BIGINT UNSIGNED NOT NULL DEFAULT 0    COMMENT '删除时间',PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统用户表';CREATE TABLE IF NOT EXISTS `sys_role` 
(`id`                  BIGINT UNSIGNED NOT NULL              AUTO_INCREMENT COMMENT '自增PK',`name`                VARCHAR(50)     NOT NULL              COMMENT '角色名称',`code`                VARCHAR(50)     NOT NULL              COMMENT '角色code码',`sort`                INT             NOT NULL              COMMENT '排序',`enable`              TINYINT(1)      NOT NULL              COMMENT '状态:1正常 2禁用',`created_at`          BIGINT UNSIGNED NOT NULL              COMMENT '创建时间',`updated_at`          BIGINT UNSIGNED NOT NULL              COMMENT '更新时间',`deleted_at`          BIGINT UNSIGNED NOT NULL DEFAULT 0    COMMENT '删除时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_code` (`code`, `deleted_at`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统角色表';CREATE TABLE IF NOT EXISTS `sys_menu` 
(`id`                  BIGINT UNSIGNED NOT NULL               AUTO_INCREMENT COMMENT '自增PK',`pid`                 BIGINT UNSIGNED NOT NULL DEFAULT 0     COMMENT '父级id',`name`                VARCHAR(50)     NOT NULL               COMMENT '菜单名称',`url`                 VARCHAR(150)    NOT NULL DEFAULT ''    COMMENT '菜单名称',`icon`                VARCHAR(50)     NOT NULL               COMMENT '图标',`type`                TINYINT(1)      NOT NULL               COMMENT '类型:1菜单 2节点',`sort`                INT             NOT NULL               COMMENT '排序',`permission`          VARCHAR(150)    NOT NULL DEFAULT ''    COMMENT '权限标识',`created_at`          BIGINT UNSIGNED NOT NULL               COMMENT '创建时间',`updated_at`          BIGINT UNSIGNED NOT NULL               COMMENT '更新时间',`deleted_at`          BIGINT UNSIGNED NOT NULL DEFAULT 0     COMMENT '删除时间',PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统菜单表';CREATE TABLE IF NOT EXISTS `sys_user_role` 
(`id`                  BIGINT UNSIGNED NOT NULL               AUTO_INCREMENT COMMENT '自增PK',`user_id`             BIGINT UNSIGNED NOT NULL               COMMENT '用户ID',`role_id`             BIGINT UNSIGNED NOT NULL               COMMENT '角色ID',  `created_at`          BIGINT UNSIGNED NOT NULL               COMMENT '创建时间',`updated_at`          BIGINT UNSIGNED NOT NULL               COMMENT '更新时间',`deleted_at`          BIGINT UNSIGNED NOT NULL DEFAULT 0     COMMENT '删除时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_user_role` (`user_id`, `role_id`, `deleted_at`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户角色关联表';CREATE TABLE IF NOT EXISTS `sys_role_menu` 
(`id`                  BIGINT UNSIGNED NOT NULL               AUTO_INCREMENT COMMENT '自增PK',`menu_id`             BIGINT UNSIGNED NOT NULL               COMMENT '菜单ID',`role_id`             BIGINT UNSIGNED NOT NULL               COMMENT '角色ID',  `created_at`          BIGINT UNSIGNED NOT NULL               COMMENT '创建时间',`updated_at`          BIGINT UNSIGNED NOT NULL               COMMENT '更新时间',`deleted_at`          BIGINT UNSIGNED NOT NULL DEFAULT 0     COMMENT '删除时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_role_menu` (`menu_id`, `role_id`, `deleted_at`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色菜单关联表';

相关文章:

系统架构设计-权限模块的设计

系统架构-权限模块的设计 如何评估一个研发人员技术水平,在大部分的情况下不是看其完成业务代码的好坏,更多的时候还是需要看这个研发人员从零构建一个完整项目的能力,在大公司中这样的机会可能相对较少,大部分的时间里都是对现有…...

IDEA切换Python虚拟环境

前言 因为之前一直使用的IDEA开发,换到VSCODE之后各种不习惯,特别是DEBUG的操作,特别难受,因此决心换回IDEA 环境配置 已有项目调整 进入Project 选择SDKs,新建Python 配置Conda以及虚拟环境 有就选择一个虚拟环境…...

《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

1、前言 边缘检测: 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域,它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作,可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测…...

prime靶机打靶记录

靶机下载地址 https://download.vulnhub.com/prime/Prime_Series_Level-1.rar nmap搜索目标 使用nmap -sn 192.168.41.0/24找到目标靶机192.168.41.136 扫描端口,因为是靶机,所以速率直接调了10000 扫出来两个端口22和80,进行详细的扫描 没…...

树莓派,linux换清华源

清华源网址 https://mirrors.tuna.tsinghua.edu.cn/help/raspbian/ 更换软件源 鉴于国内网络环境下载各大镜像,软件包速度慢的问题,需要更换软件源,以防下载慢,且在本教程中,统一更换为清华源。 2.3.1 更换树莓派软…...

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时,往往会遇到数据库迁移的任务。如果数据量不是特别大&…...

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中,容器编排工具的选择对于简化流程、提高效率至关重要。本…...

IP地址定位不准确的情况研究

在互联网的浩瀚海洋中,每一台连接到网络的设备都被赋予了一个独特的标识符,这就是IP地址。它就像是我们在线身份的一部分,帮助我们与他人进行通信,获取信息,以及享受各种网络服务。然而,由于各种原因&#…...

武汉凯迪正大KDZD5289硫化曲线测试仪(电脑无转子硫化仪)

电脑无转子硫化仪 硫化时间测试仪 硫化曲线仪 硫化曲线测试仪 武汉凯迪正大KDZD5289产品概述 KDZD5289硫化曲线测试仪(电脑无转子硫化仪)采用电脑控制进口温控仪进行准确控温,计算机适时进行数据处理并可进行统计、分析、存储对比等&#xff…...

Topic和Partition

作用 主题作为消息的一级分类, 分区是对二级分类。分区是Kafka可伸缩性和水平扩展的关键, 也是多副本机制保证可用性的基础。分区可以有一到多个副本, 每个副本对应1个日志文件, 每个日志文件对应1到多个日志分段。每个日志分段又可以细分为日志文件, 索引文件和快照文件。 创…...

算法通关村第十四关|黄金挑战|数据流的中位数

数据流的中位数 原题:力扣295. 设计一种数据结构可以支持添加整数和返回中位数的操作。 之前写过找中间用两个堆,这道题就可以使用一个大顶堆和一个小顶堆。 大顶堆存储比较小的元素,小顶堆存储比较大的元素。 class MedianFinder {Prio…...

挑选数据可视化工具:图表类型、交互功能与数据安全

作为一名数据分析师,我经常需要使用各种数据可视化工具来将数据以直观、清晰的方式呈现出来,以便更好地理解和分析。在市面上的众多可视化工具中,我根据实际需求和项目特点进行选择。本文将从以下几个角度对市面上的数据可视化工具进行对比&a…...

华纳云:有效解决服务器宕机的办法

服务器宕机可能是由多种原因引起的,包括硬件故障、软件问题、网络问题等。以下是一些简单的解决服务器宕机问题的办法: 检查硬件连接: 确保服务器的所有硬件连接正常。检查电源线、网络连接、存储设备连接等,确保没有松动或断开的…...

坦克大战-部分

通过键盘操控坦克移动,转弯,射击 消灭所有敌人可以过关 23个类,3个gif图片 wsad控制移动 j射击 砖墙限制移动,可以打穿;铁墙,限制移动,不能打穿;水&#x…...

OracleRac跨网段修改Public IP/VIP/Private IP/Scan IP

本验证于测试环境,生产操作需谨慎 现为测试环境,机器有且仅有两个网卡存在,需求修改Public IP/VIP/Private IP/Scan IP,把Public IP/VIP/Scan IP的网段改为Private IP的网段,Private IP于Public IP网段互换。 先停掉两…...

使用Pytorch从零开始实现BERT

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I,Transformer II [3] 变分自编码器 [4] 生成对抗网络,高级生成对抗网络 I,高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…...

Python爬虫-新能源汽车销量榜

前言 本文是该专栏的第11篇,后面会持续分享python爬虫案例干货,记得关注。 本文以懂车平台的新能源汽车销量榜单为例,获取各车型的销量排行榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。 废话不多说,跟着笔者直接往下看正文详细内容。(附带…...

外包干了8个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

<JavaEE> volatile关键字 -- 保证内存可见性、禁止指令重排序

目录 一、内存可见性 1.1 Java内存模型(JMM) 1.2 内存可见性演示 二、指令重排序 三、关键字 volatile 一、内存可见性 1.1 Java内存模型(JMM) 1)什么是Java内存模型(JMM)?Java内存模型即Java Memory Model,简…...

docker安装mysql8

docker安装mysql8 docker search mysql:8 #搜索可以使用的msyql8的镜像 docker pull mysql:8.0.27 #拉去mysql8的镜像 创建挂载的宿主机目录 mkdir -p /data/mysql/mysql8/conf # 配置文件目录 mkdir -p /data/mysql/mysql8/data # 数据目录 touch /data/mysql/mysql8/conf/my.…...

消息丢失排查方法?

遇到丢消息问题,如果是单聊,群聊,聊天室,系统消息可以在开发者后台北极星自助查询一下消息是否发送成功。根据您实际发送的相关信息(发送者、接收者、时间、消息 ID ……)看是否可以查到消息 如果消息查不到…...

Linux 匿名页反向映射

1. 何为反向映射 正向映射: 用户进程在申请内存时,内核并不会立刻给其分配物理内存,而是先为其分配一段虚拟地址空间,当进程访问该虚拟地址空间时,触发page fault异常,异常处理流程中会为其分配物理页面&am…...

国内首个农业开源鸿蒙操作系统联合华为正式发布

2023年11月29日,在中国国际供应链促进博览会上,中信农业科技股份有限公司(简称“中信农业”)与深圳开鸿数字产业发展有限公司(简称“深开鸿”)以及华为技术有限公司(简称“华为”)联…...

python HTML文件标题解析问题的挑战

引言 在网络爬虫中,HTML文件标题解析扮演着至关重要的角色。正确地解析HTML文件标题可以帮助爬虫准确地获取所需信息,但是在实际操作中,我们常常会面临一些挑战和问题。本文将探讨在Scrapy中解析HTML文件标题时可能遇到的问题,并…...

AIM: Symmetric Primitive for Shorter Signatures with Stronger Security

目录 笔记后续的研究方向摘要引言贡献 AIM: Symmetric Primitive for Shorter Signatures with Stronger Security CCS 2023 笔记 后续的研究方向 摘要 基于头部MPC(MPCitH)范式的后量子签名方案最近引起了人们的极大关注,因为它们的安全性…...

【 Go语言使用xorm框架操作数据库】

Go语言使用xorm框架操作数据库 Xorm 是一个简单而强大的Go语言ORM(对象关系映射)库。它支持自动将结构体映射到数据库表,并提供了一系列便捷的API来执行CRUD(创建、读取、更新和删除)操作。 安装 Xorm 首先&#xf…...

DouyinAPI接口系列丨Douyin商品详情数据接口丨Douyin视频详情数据接口

抖音商品详情API是抖音开放平台提供的一套API接口,用于获取商品详情信息。通过该API,开发者可以获取到商品的详细信息,包括商品ID、名称、描述、价格、销量、评价等信息。 在使用抖音商品详情API之前,需要先注册并登录抖音开放平…...

旺店通对接中国南方电网,打破跨系统连接,让数据轻易互通成为现实

接入系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智能化管理升级。为零售电商企业的订单管理及仓储管理提供…...

简介Kadane算法及相关的普通动态规划

简介Kadane算法及相关的普通动态规划 本文详细论述Kadane算法的经典题目,并通过“首先列出动态规划解法,再改为Kadane算法解法”的方式,讲解二者的不同。最后给出一道Kadane算法变体的题目,解法极为简洁优美。 Kadane算法也是一…...

校园教务管理系统

学年论文(课程设计) 题目: 信息管理系统 校园教务管理系统 摘要:数据库技术是现代信息科学与技术的重要组成部分,是计算机数据处理与信息管理系统的核心,随着计算机技术的发展,数据库技…...

深圳网站建设网络/2023最火的十大新闻

我正在想办法,如果不需要的话,我该如何隐藏overflow-y:scroll;。我的意思是,我正在建立一个网站,我有一个主要的区域,文章将显示,我想隐藏滚动条,如果内容不超过当前的宽度。还有,我…...

wordpress 更改icon/营销型网站建设推广

最根本的原因就是,走弯路是自然界的一种常态,走直路而是一种非常态。佛学院的一名禅师在上课时把一幅中国地图展开,问:“这幅图上的河流有什么特点?”“都不是直线,而是弯弯的曲线。”“为什么会是这样呢?也就是说,河…...

常州网站建设公司报价/今日军事新闻最新消息新闻报道

声明一个类&#xff0c;必须实现<RCTBridgeModule> 协议 .m文件中实现宏定义RCT_EXPORT_MODULE&#xff08;&#xff09;&#xff0c;当它加载的时候&#xff0c;会自动注册 // js_name 就是react native 获取类时所对应的名称&#xff0c; // 即 NativeModules.js_name…...

高校网站建设/搭建一个网站

本节我们紧接上节内容,来实现我们对全局变量组的增删改查。 说起增删改查,其实就是curd,业务开发们每天的日常.... 也是测开最不想做的功能之一。 不过为了广大粉丝朋友,再苦再难,都要啃下去~ 谁让我的公众是很硬核的干货呢? 谁让搜索测试开发,结果是这样呢? -----…...

淘客网站怎么做淘口令/百度竞价排名又叫

编写安全的代码很困难&#xff0c;当你学习一门编程语言、一个模块或框架时&#xff0c;你会学习其使用方法。在考虑安全性时&#xff0c;你需要考虑如何避免代码被滥用&#xff0c;Python也不例外&#xff0c;即使在标准库中&#xff0c;也存在着许多糟糕的实例。然而&#xf…...

做旅游网站的好处/52种新颖的促销方式

所谓插入排序&#xff0c;就是检查第i个数字&#xff0c;若比它的左边的数字小&#xff0c;则进行交换&#xff0c;一直持续这个动作&#xff0c;直到它的左边的数字比它还要小&#xff0c;则停止。 #coding:utf-8def insertion_sort(nums): for i in range(1,len(nums)): …...